POJ 2389 : 大数相乘

#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(); }

你可能感兴趣的:(c,include)