当前位置: 代码迷 >> C语言 >> 超长整数的乘法
  详细解决方案

超长整数的乘法

热度:639   发布时间:2008-04-05 01:33:22.0
超长整数的乘法
////////////////////////////////////////////////////////////////////////////////////
/*
                                 超长整数的乘法
本程序用于计算超过long型整数范围的超长整数的乘积,比如两个300位的整数相乘。
*/
////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

#define MAX 500

void WorkOut(char a[], char b[]);

int main()
{
    char a[MAX], b[MAX];
    int i = 0;   
    printf("本程序用于计算大数乘法,当输入的乘数和被乘数均为零时退出程序:\n");
    while (1)
    {
        printf("输入被乘数:");
        scanf("%s", &a);
        printf("输入乘数:");
        scanf("%s", &b);

        if (a[0] == '0' && b[0] == '0')
            break;
        WorkOut(a, b);        
    }
    return 0;
}

void WorkOut(char a[], char b[])
{
    char result[MAX*2], carry, caculate[MAX*2], temp;
    int i, j, k;
    int tailA, tailB;
    
    //将每位的字符指转换成相应的数字值,并将顺序反置
    //caculate[]临时用作中间变量
    i = 0;
    while (a[i] != '\0')
    {
        caculate[i] = a[i] - '0';    //ASCII码转化成对应数字
        i++;
    }
    tailA = i - 1;
    for (i = tailA, j = 0; i >= 0; i--, j++)
        a[j] = caculate[i];

    i = 0;
    while (b[i] != '\0')
    {
        caculate[i] = b[i] - '0';
        i++;
    }
    tailB = i - 1;
    for (i = tailB, j = 0; i >= 0; i--, j++)
        b[i] = caculate[j];
        
    //清零累加和数组
    for (i = 0; i <= MAX * 2 - 1; i++)
        result[i] = caculate[i] = 0;

    for (i = 0; i <= tailB; i++)
    {
        carry = 0;

        for (j = 0; j <= tailA; j++)
        {
            temp = b[i] * a[j] + carry;
            carry = temp / 10;    //carry存放放进位
            temp = temp % 10;     //temp存放当前位值

            if (temp + caculate[i+j] >= 10) //当前位相加大于10则进位
            {
                caculate[i+j] = (temp + caculate[i+j]) % 10;
                carry++;
            }
            else                            //当前位相加小于10
                caculate[i+j] = temp + caculate[i+j];
        }
        caculate[i+j] = carry;             //加上最高位进位
    }
   
    i = MAX * 2 - 1;
    while (caculate[i] == 0)
        i--;
    for (j = i, k = 0; j >= 0; j--, k++)    //反序并与数字之转换成相应ACCII码
        result[k] = caculate[j] + '0';
    result[k] = '\0';
    printf("乘积:%s\n", result);
}

///////////////////////////////////////////////////////////////////////////////////////
/*
我试着用WorkOut返回结果字符串的头指针,但是在main函数中输出时总是乱码,那位高手可以指点
一下啊。
*/
////////////////////////////////////////////////////////////////////////////////////////
搜索更多相关的解决方案: 整数  乘法  int  MAX  char  

----------------解决方案--------------------------------------------------------
收下,看看
----------------解决方案--------------------------------------------------------
  相关解决方案