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(); }
相关文章推荐
- poj2389 大数问题-大数相乘
- poj 2389 Bull Math(可做大数相乘模板)
- POJ 2389 Bull Math(水~Java -大数相乘)
- poj2389 大数相乘
- POJ2389大数相乘
- POJ1001大数相乘
- POJ 2389 Bull Math 高精度(大数)乘法 模板
- poj2389 普通的大数乘法
- poj 2389 解题报告 大数乘法
- POJ 2389 Bull Math 高精度(大数)乘法 模板
- POJ 2109 Power of Cryptography二分+大数相乘和pow为什么可以直接过的原因
- poj 2389 大数乘法
- 大数乘法 poj 2389 ||大数乘法 hdu1402 FFT模板
- poj2389 Bull Math(大数java)
- POJ 2389大数乘法
- POJ Round and Round We Go(核心大数相乘算法)
- poj2389---大数乘法
- POJ 2389 大数问题
- poj 2389 BullMath(大数乘法)
- POJ 2389 Bull Math(大数乘法,还是Java好)