码迷,mamicode.com
首页 > 其他好文 > 详细

大数加法和大数乘法

时间:2020-02-23 18:10:02      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:ack   fine   get   大数乘法   长度   include   mic   image   lse   

本文学习之这篇博客:https://www.cnblogs.com/-Ackerman/

首先我们来看大数加法技术图片

 

 

 可以这样理解,先相加,再进位,当然我们这里全部用字符串来存储,看代码就懂了

#include<bits/stdc++.h>
using namespace std;

string BigAdd(string s1,string s2)
{
    string anser;
    int len1=s1.length();//获取字符长度 
    int len2=s2.length();
    int num1[100]={0},num2[100]={0};//这样可以很好解决前导0 
    for(int i=0;i<len1;i++)
        num1[len1-i-1]=s1[i]-0;//逆序添加到num1中,即num1中是按照 个 十 百。。。 
    for(int i=0;i<len2;i++)
        num2[len2-i-1]=s2[i]-0;
    int lenth=len1>len2?len1:len2;
    for(int i=0;i<lenth;i++)
    {
        num1[i]+=num2[i];//各位加法
        num1[i+1]+=num1[i]/10;//进位,将后小位进到大位上 
        num1[i]%=10;//进位后的余数保存到小位上 
    }
    if(!num1[lenth]) //去前导0 
lenth--; for(int i=lenth;i>=0;i--) { anser+=num1[i]+0; } return anser;//将计算结果返回 } int main() { string a,b; while(cin>>a>>b) { cout<<BigAdd(a,b)<<endl; } return 0; }

如果你能理解大数加法,那么大数乘法和它其实在进位原理上相同,但需要明白乘法怎么算

我以98*23为例,答案=3*8+3*9*10+2*10*8+2*10*9*10,你可以自己验证我写的对不对

乘法的规律:即一个数的第i 位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
即:ans[i+j] = a[i]*b[j];

#include<bits/stdc++.h>
using namespace std;
#define MAX 100    
int x[MAX+10],y[MAX+10],z[MAX*2+10],i,j;
string BigMultiply(string a,string b)
{
    int len1=a.length();
    int len2=b.length();
    string anser;
     for(j=0,i=len1-1;i>=0;i--)//将字符串中字符转化为数字,并倒序储存
        x[j++]=a[i]-0;//这里加了个J比较方便 等同于上面大数加法的[len-i-1],看你理解那个容易 
    for(j=0,i=len2-1;i>=0;i--)
        y[j++]=b[i]-0;
    for(int i=0;i<len1;i++)
    {
        for(int j=0;j<len2;j++)
        {
            z[i+j]+=x[i]*y[j];// 
        }
    }
    for(int i=0;i<2*MAX;i++)
    {
        if(z[i]>=10) //进位 
        {
        z[i+1]+=(z[i]/10);
        z[i]=z[i]%10;
        }
    }
    for(i=MAX*2;i>0;i--)  //删除0的前缀
    {
        if(z[i]==0)
            continue;
        else
            break;
    }
    for(;i>=0;i--)  //倒序输出
        anser+=z[i]+0;
    return anser;
} 

int main()
{
    string a,b;
    while(cin>>a>>b)
    {
        cout<<BigMultiply(a,b)<<endl;
    }
    return 0;
}

 

大数加法和大数乘法

标签:ack   fine   get   大数乘法   长度   include   mic   image   lse   

原文地址:https://www.cnblogs.com/Truedragon/p/12350691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!