| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 663 人关注过本帖
标题:C语言编写十进制乘法器
只看楼主 加入收藏
lxn971003
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-11-23
  问题点数:0  回复次数:2   
C语言编写十进制乘法器
求大家帮忙解答 下面是我在CSDN论坛上看见的 一个帖子 对我有所启发 但赵中老师的算法可能是陷入了死循环 用CODEBLOCK 打开程序后输入算式没有得数显示
而最后一个回答在加入了名头#include<string.h>将mem declare之后输出的是一堆乱码 请大家帮忙解决一下 或者也可以帮忙编写一个新程序也可以 时间紧迫啊 兄弟们 求求各位了!!!
http://bbs.csdn.net/topics/390103886
搜索更多相关主题的帖子: include  十进制  C语言  
2016-11-23 22:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:151
帖 子:6028
专家分:26334
注 册:2014-5-20
  得分:0 
要求不少于35位数,是超大数乘法吧,找了个示例,未严格测试,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN 256

int _isNum(const char *num)
{
    for (; *num != 0; num++)
    {
        if ((*num > '9') || (*num < '0'))
        {
            printf("输入的数含有非法的字符!!!\n");
            return 0;
        }
    }
    return 1;
}

void _addCarry(int *result, int count)
{
    int i;
    for (i=(count-1); i>0; i--)
    {
        int tmp = result[i];
        if (tmp >= 10)
        {
            result[i]    = tmp % 10;
            result[i-1] += tmp / 10;
        }
        else if (tmp < 0)
        {
            result[i]   += 10;
            result[i-1] -= 1;
        }
    }
}

char* _NumToStr(int *num, int count, char ch)
{
    int i;
    for (; count>1 && *num==0; num++, count--) NULL;
    if (*num==0) ch='+';
    char *resultStr = (char*)malloc((count+2) * sizeof(char));
    memset(resultStr, 0, (count+1) * sizeof(char));
    if (ch=='-')
    {
        strcat(resultStr, "-");
    }
    char sz[5];
    for (i=0; i<count; i++)
    {
        itoa(num[i], sz, 10);
        strcat(resultStr, sz);
    }
    return resultStr;
}

char* _imulBigNum(char *num1, char *num2)
{
    int i, j;
    if (*num1==0 || *num2==0) return NULL;
    char ch='+', ch1='+', ch2='+';
    if (*num1=='-')
    {
        ch1 = '-';
        num1++;
    }
    if (*num2=='-')
    {
        ch2 = '-';
        num2++;
    }
    if (!_isNum(num1)) return NULL;
    if (!_isNum(num2)) return NULL;
    ch = (ch1==ch2) ? '+' : '-';
    int num1Len = strlen(num1);
    int num2Len = strlen(num2);
    if ((num1Len > MAXLEN) || (num2Len > MAXLEN))
    {
        printf("输入的数的数位长度超出范围(<=%d)\n", MAXLEN);
        return NULL;
    }

    int resultLen = num1Len + num2Len - 1;
    int *result = (int*)malloc(resultLen * sizeof(int));
    memset(result, 0, resultLen * sizeof(int));
    for (i=num1Len-1; i>=0; i--)
    {
        for (j=num2Len-1; j>=0; j--)
        {
            result[i+j] += (num1[i] - '0') * (num2[j] - '0');
        }
    }
    _addCarry(result, resultLen);
    char *resultStr = _NumToStr(result, resultLen, ch);
    free(result);
    return resultStr;
}

main()
{
    char str1[MAXLEN+1], str2[MAXLEN+1];
    char *num1=str1, *num2=str2, *result;
    int i;
    printf("被乘数:");
    gets(num1);
    printf("乘数:");
    gets(num2);
    for (i=0; (*num1=='0' && *(num1+1)!=0); num1++) NULL;
    for (i=0; (*num2=='0' && *(num2+1)!=0); num2++) NULL;
    result = _imulBigNum(num1, num2);
    if (result != NULL)
    {
        printf("(%s) * (%s) = %s\n", num1, num2, result);
        free(result);
    }
}

2016-11-24 09:40
lxn971003
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-11-23
  得分:0 
回复 2楼 吹水佬
谢谢大神解答!!!!
2017-01-01 11:36







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028667 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved