高精度乘法

【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。

【输入】
输入两个高精度正整数M和N。

【输出】
求这两个高精度数的积。

【输入样例】
36
3
【输出样例】
108
#include<iostream>  
#include<cstring>  
#include<string>  
using namespace std;  
char s1[256],s2[256];
int a[256],b[256],c[256];
int main()
{
    cin>>s1;
    cin>>s2;
    int lena,lenb,i,j,lenc;
    lena=strlen(s1);
    lenb=strlen(s2);
    for(i=0;i<=lena;i++)     //将字符串转换为数字逆序存入数组中
        a[lena-i]=s1[i]-'0';
    for(i=0;i<=lenb;i++)
        b[lenb-i]=s2[i]-'0';
        for(i=1;i<=lenb;i++)  //外层循环当做乘数;双层循环跑起来,不仅次次进位,还把乘数相加起来进位(相当于列竖式数字相加)
        {
            int x=0;       //用来进位的,外循环结束一遍后进位x要归零处理
        for(j=1;j<=lena;j++)  //内存循环跑乘法,也要注意进位
        {
            c[i+j-1]=c[i+j-1]+x+a[j]*b[i];  //此位=此位加上进的位x+ab乘积
            x=c[i+j-1]/10;         //进前位,所以除以10
            c[i+j-1]=c[i+j-1]%10;  //对10取余,留下本位的
        }
        c[i+lena]=x;   //内层循环跑完(b乘完了a的各个位),x应进到下一位
    }
        lenc=lena+lenb;
         while((c[lenc]==0)&&(lenc>1))  //去掉前导零
                 lenc--;  
        for(i=lenc;i>=1;i--)   //逆序输出c数组
            cout<<c[i];  
        cout<<endl;  
    return 0;  
}

大数用字符数组输入,将各个数位转化为数值存入数组中;双层循环中的乘法是反过来乘的;

posted @ 2018-08-23 15:56  RAIN-code  阅读(1815)  评论(0编辑  收藏  举报