【C++大整数/高精度专题】
大整数加法
题目描述
实现一个加法器,使其能够输出a+b的值。
输入描述:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出描述:
可能有多组测试数据,对于每组数据, 输出a+b的值。
示例1
输入
2 6 10000000000000000000 10000000000000000000000000000000
输出
8 10000000000010000000000000000000
思路:翻转=》字符串转为整数=》倒序相加=》从第一个不是0的位置倒序输出。
注意:可能出现相加之后位数相加的情况。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 string a,b; 5 while(cin>>a>>b){ 6 reverse(a.begin(),a.end()); 7 reverse(b.begin(),b.end()); 8 int a1[1000]={0},b1[1000]={0},sum[1005]={0}; 9 for(int i=0;i<a.size();i++){ 10 a1[i]=a[i]-'0'; 11 } 12 for(int i=0;i<b.size();i++){ 13 b1[i]=b[i]-'0'; 14 } 15 int jinwei=0; 16 for(int i=0;i<a.size()||i<b.size();i++){ 17 if(a1[i]+b1[i]+jinwei<10){ 18 sum[i]=a1[i]+b1[i]+jinwei; 19 jinwei=0; 20 }else{ 21 sum[i]=(a1[i]+b1[i]+jinwei)%10; 22 jinwei=(a1[i]+b1[i]+jinwei)/10; 23 } 24 } 25 int flag=0; 26 int len=a.size()>b.size()?a.size()+2:b.size()+2; 27 for(int i=len;i>=0;i--){ 28 if(sum[i]!=0) flag=1; 29 if(flag==1) cout<<sum[i]; 30 } 31 cout<<endl; 32 } 33 return 0; 34 }
大整数减法
大整数乘法
思路:转为倒序=》字符串转为整数=》实现乘法过程=》如有进位(>10)则进位=》从第一个不是0的位置倒序输出。
注意:可能存在相乘之后位数增加的情况。而且我们不急于处理进位,而是将进位问题留到后面处理
1 //找规律发现:1):m*n为偶数,则结果=m*n; 2):m*n为奇数,则结果=m*n.41; 2 //题目要求的 位数来看 为大整数乘法问题。 3 /* 4 测试用例: 5 2355086803166315002706869441938550399 2462124187763117841172283248921642701 6 7 对应输出应该为: 8 9 5798516182357501108831165998781650464714548218835270901874024217758987699.41 10 */ 11 //找规律发现:1):m*n为偶数,则结果=m*n; 2):m*n为奇数,则结果=m*n.41; 12 #include <bits/stdc++.h> 13 using namespace std; 14 int main(){ 15 string a,b; 16 while(cin>>a>>b){ 17 int a1[100]={0},b1[100]={0},c[100]={0}; 18 reverse(a.begin(),a.end()); 19 reverse(b.begin(),b.end()); 20 for(int i=0;i<a.size();i++){ 21 a1[i]=a[i]-'0';//转换成整数; 22 } 23 for(int i=0;i<b.size();i++){ 24 b1[i]=b[i]-'0'; 25 } 26 for(int i=0;i<a.size()+2;i++){ 27 for(int j=0;j<b.size()+2;j++){ 28 c[i+j]+=a1[i]*b1[j];//关键---实际上就是实现小学纸上乘法的过程,只不过注意这里是倒序--下标变化。 29 } 30 } 31 for(int i=0;i<=a.size()+b.size()+2;i++){ 32 if(c[i]>=10){//存在进位的情况 33 c[i+1]+=c[i]/10; 34 c[i]=c[i]%10; 35 } 36 } 37 int len=a.size()+b.size()+5;//+5是为了防止溢出 38 int flag=0; 39 for(int i=len;i>=0;i--){ 40 if(c[i]!=0) flag=1; 41 if(flag==1) cout<<c[i]; 42 } 43 if(c[0]%2==0){//如果结果末位%2==0则为偶数,否则为奇数 44 cout<<".00"<<endl; 45 }else{ 46 cout<<".41"<<endl; 47 } 48 } 49 return 0; 50 }
大整数阶乘
链接:https://www.nowcoder.com/questionTerminal/f54d8e6de61e4efb8cce3eebfd0e0daa
来源:牛客网
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
输入
4 5 15
输出
24 120 1307674368000
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,num[3000]={0}; 5 while(cin>>n){ 6 num[0]=1; 7 int nowWid=1,jinwei,tmp; 8 for(int i=2;i<=n;i++){ 9 jinwei=0; 10 for(int j=0;j<nowWid;j++){ 11 tmp=(num[j]*i+jinwei)/10; 12 num[j]=(num[j]*i+jinwei)%10; 13 jinwei=tmp; 14 } 15 while(jinwei!=0){ 16 num[nowWid++]=jinwei%10; 17 jinwei/=10; 18 } 19 } 20 while(nowWid--) 21 cout<<num[nowWid]; 22 cout<<endl; 23 } 24 return 0; 25 }

浙公网安备 33010602011771号