计算机的计数方式和人不一样,众所周知,计算机的数据类型是有范围的。当处理上千乃至上万位数时,简单的数据类型不能胜任。下为各数据类型范围。
回忆下小学数学竖式加法,我们要做的就是将一个数的各位数字用数组存起来,再让两个数组想做小学加法那样加起来,得到新的数组,再遍历输出,就能得到想要的超大数。
1 7 3
+ 8 1
2 5 4
下面是小学数学的模拟过程
#include<bits/stdc++.h>
using namespace std;
int arr[1000000]={0},brr[1000000]={0},crr[1000001]={0};
char a[1000000],b[1000000];
int main()
{
cin>>a>>b;
for(int i=strlen(a)-1;i>=0;--i)//数据导入,因为要把数位对齐,这里要倒序导入数据,把数字从右往左写
{
arr[i]=a[strlen(a)-1-i]-'0';
}
for(int i=strlen(b)-1;i>=0;--i)
{
brr[i]=b[strlen(b)-1-i]-'0';
}
//开始小学加法
for(int i=0;i<max(strlen(a),strlen(b))+1;++i)//从0位也就是个位开始,注意i的循环条件要多预留一位来处理进位
{
crr[i]+=arr[i]+brr[i];//对齐的数位相加
crr[i+1]+=crr[i]/10;//进位
crr[i]%=10;
}
int m;//下面会用到的位数
for(int i=max(strlen(a),strlen(b))+2;i>=0;--i)//输出时候再倒一遍,注意高位的0是不能输出的
{
if(crr[i]!=0)
{
m=i;//得到最高位
break;
}
}
for(int i=m;i>=0;--i)//倒序输出
{
cout<<crr[i];
}
return 0;
}
很简单吧,小学就干的事,不过代码还要自己打一打,才是你自己的东西。、
乘法也一样,回忆下小学数学的竖式乘法
1 1 1
* 1 1
1 1 1
+ 1 1 1
1 2 2 1
可以看出,如果把个位看成第0位,十位看成第1位,那么乘积结果的第i位就是做运算的两数的j和i-j位之积再求和,如上式的第1位(十位)是第一个数的第0位乘第二个数的第1位,再加第一个数的第1位乘第二个数的第0位.
下面模拟竖式乘法
#include<bits/stdc++.h>
using namespace std;
int arr[1000000]={0},brr[1000000]={0},crr[2000005]={0};//乘法注意开两倍长度
char a[1000000],b[1000000];
int main()
{
cin>>a>>b;
for(int i=strlen(a)-1;i>=0;--i)
{
arr[i]=a[strlen(a)-1-i]-'0';
}
for(int i=strlen(b)-1;i>=0;--i)
{
brr[i]=b[strlen(b)-1-i]-'0';
}
for(int i=0;i<=strlen(a)*strlen(b)+1;++i)
{
for(int j=0;j<=i;++j)
{
crr[i]+=arr[j]*brr[i-j];//核心运算
}
crr[i+1]+=crr[i]/10;//进位
crr[i]%=10;
}
int m;//位数
for(int i=strlen(a)*strlen(b)+1;i>=0;--i)
{
if(crr[i]!=0)
{
m=i;
break;
}
}
for(int i=m;i>=0;--i)
{
cout<<crr[i];
}
return 0;
}
完事收工