大数相乘

oj能力真需要没事多练练,开发智力,时间久了就忘了。

 1

题目:输入两个超长的整数(只有0~9的字符长串),输出这两个整数的乘积。

 

思路:以ab * cd为例,计算过程如下图,cab的每一位相乘,结果存入数组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;
}

 

posted @ 2020-02-09 20:53  ho966  阅读(112)  评论(0编辑  收藏  举报