您的位置:首页 > 其它

POJ 2389 : 大数相乘

2010-08-14 03:58 471 查看
#include <cstdio>
#include <cstring>
#include <iostream>

#define MAX 44

char num1[MAX] = {0};                              //用于存放两个乘数
char num2[MAX] = {0};
char ret[2*MAX] = {0};                             //存放结果

void calc()
{
int len1 = strlen(num1);
int len2 = strlen(num2);

int i, j, carry = 0, sum, idx, ca;
for (i = len2 - 1; i >= 0; i--)               //num2为乘数
{
idx = len2 - 1 - i;                       //idx表示每次错位相加,应错开的位数,第一次为0,第二次乘法的结果从上一次的第1位开始加
ca = 0;
for (j = len1 - 1; j >= 0; j--)           //num1为被乘数
{
sum = (num2[i] - '0') * (num1[j] - '0') + carry;           //carry为乘法进位

carry = sum / 10;
sum %= 10;

//对每次的乘积进行累加
if (ret[idx] == 0)                    //如果该位是第一次加,那么应该在0的基础上加上'0'
{
ret[idx] += sum + '0' + ca;       //ca为加法进位
ca = 0;
}
else
{
ret[idx] += sum + ca;             //如果该位之前已经被加过,则不应该加上'0'
ca = 0;
}

while (ret[idx] > '9')
{
ret[idx] -= ('9' - '0' + 1);
ca++;
}
idx++;
}

//累加到最高位后,本次乘法和加法的进位可加到一起
carry += ca;
while (carry > 0)
{
ret[idx] = carry % 10 + '0';
carry /= 10;
idx++;
}
}

//准备输出,去掉最高位的'0'
while (idx - 1 > 0 && ret[idx-1] == '0')
{
idx--;
}
for (i = idx-1; i >= 0; i--)
{
printf("%c", ret[i]);
}

printf("/n");
}
int main()
{
//scanf("%s", num1);
//scanf("%s", num2);

std::cin >> num1;
std::cin >> num2;

calc();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: