大整数运算的来源
常用的数据类型及其表示范围 :
UInt32/unsigned int: 0~4294967295
Int32/int: -2147483648~2147483647
Int64/long long: -9223372036854775807~9223372036854775808
UInt64/unsigned long long:0 ~18446744073709551615
float: -3.4E-38~3.4E+38
double : 1.7E-308~1.7E+308
首先看看python怎么写
a=int(input())
b=int(input())
print(a*b)
唉,流泪
由于c++跟python不一样,它的数据类型范围是有限的,最大能表示的正整数也只有20位,数据再大一些的时候就会发生数据溢出,这时候我们可以借助字符串来进行大整数运算;
1.大整数运算仿照小学加减乘除计算方法(就是手算时在草稿本上的步骤,写代码的时候脑子里时刻想象着这个步骤来写代码),进行模拟运算;
2.大整数加减乘法是借助int数组(或者vector数组)和字符串进行操作,字符串默认没有前导0
3.加减乘每次计算前都将字符串先翻转一下,从最低位开始求
4.加法和乘法最后不需要判断最高位是不是0,减和除需要判断前导0
大整数加法
大整数加法是最简单的
参考代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100005;
int ans[N];
string a,b;
int main()
{
cin>>a>>b;
reverse(a.begin(),a.end()); //翻转
reverse(b.begin(),b.end());
int lena=a.length();
int lenb=b.length();
int i=0;
int jin=0;
while(i<lena&&i<lenb) //a与b相同长度的部分
{
int t=a[i]-'0'+(b[i]-'0')+jin;
ans[i]=t%10;
jin=t/10;
i++;
}
while(i<lena)
{
int t=a[i]-'0'+jin;
ans[i]=t%10;
jin=t/10;
i++;
}
while(i<lenb)
{
int t=b[i]-'0'+jin;
ans[i]=t%10;
jin=t/10;
i++;
}
if(jin) ans[i++]=jin; //最后还有进位
for(int j=i-1;j>=0;j--)
cout<<ans[j];
return 0;
}
大整数减法
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100005;
int ans[N];
string a,b;
int main()
{
cin>>a>>b;
if(a==b)
{
cout<<0;return 0;
}
if(a.length(