超长整数的乘法
/////////////////////////////////////////////////////////////////////////////////////*
超长整数的乘法
本程序用于计算超过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函数中输出时总是乱码,那位高手可以指点
一下啊。
*/
////////////////////////////////////////////////////////////////////////////////////////
----------------解决方案--------------------------------------------------------
收下,看看
----------------解决方案--------------------------------------------------------