大数相乘
oj能力真需要没事多练练,开发智力,时间久了就忘了。
1
题目:输入两个超长的整数(只有0~9的字符长串),输出这两个整数的乘积。
思路:以ab * cd为例,计算过程如下图,c和ab的每一位相乘,结果存入数组buf[4],d也和ab的每一相乘,
同样也存入buf[4],再遍历buf[4],把溢出10的进位到下一个数组坐 标。这样就可以依次输入数组buf的数,就是乘积。
代码实现:
#include <iostream> #include <string> using namespace std; #define num 5000 int main() { string s1, s2; while (cin>>s1>>s2) { // 这里用unsigned char, 因为单个数相乘再翻一倍最大182超过了128 unsigned char buf[num] = { 0 }; int m = s1.size(); int n = s2.size(); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) {// 数组每一位单独计算 buf[n + m - i - j - 2] += (int)(s1[i] - '0')*(s2[j] - '0'); } } int c = 0; for (int i=0; i<n+m;++i) {// 处理每一位的溢出问题 buf[i] += c; c = buf[i] / 10; buf[i] %= 10; } for (int i = n + m - 1; i >= 0; --i) { // 第高位如果是0就不显示 if((i==n+m-1) && buf[i] == 0) continue; cout <<(int) buf[i]; } cout << endl; } system("pause"); return 0; }