【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 }

 

 

posted @ 2020-04-19 17:28  岩烧店的烟味弥漫  阅读(222)  评论(0)    收藏  举报