5-大整数类

64 阅读1分钟

问题描述:A+B

计算两个非负整数 A,B 的和。不过这一次有些特殊,A,B 可能会很大。

输入格式

第一行输入一个非负整数 A。

第二行输入一个非负整数 B。

A,B 的长度不大于 500。

输出格式

输出 A+B的值。不要有多余的前导零。

样例输入
123
1234
样例输出
1357

详细代码:

[cpp]  view plain  copy

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. int main(){  
  4.     //利用栈   
  5.     stack<int> a1;   
  6.     stack<int> a2;  
  7.     stack<int> a3;  
  8.     //字符串形式及长度   
  9.     string str1,str2;  
  10.     int len1,len2;   
  11.     //初始化  
  12.     cin>>str1>>str2;  
  13.     len1=str1.length();  
  14.     len2=str2.length();  
  15.     //调整  
  16.     if(len1<len2){  
  17.         str1.swap(str2);  
  18.         swap(len1,len2);  
  19.     }  
  20.     //入栈 a1,a2 (复杂形式)   
  21.     int x=len1-len2;  
  22.     for(int i=0;i<x;i++)a2.push(0);  
  23.     for(int i=0;i<len1;i++)a1.push(str1[i]-'0');//数字字符入栈   
  24.     for(int i=0;i<len2;i++)a2.push(str2[i]-'0');  
  25.     //计算+入栈 a3   
  26.     int mod=0;  
  27.     for(int i=0;i<len1;i++){  
  28.         int sum=a1.top()+a2.top()+mod;  
  29.         a1.pop();a2.pop();  
  30.         a3.push(sum%10);  
  31.         mod=sum/10;  
  32.     }  
  33.     //判断进一   
  34.     if(mod)a3.push(mod),len1++;  
  35.     for(int i=0;i<len1;i++){  
  36.         cout<<a3.top();  
  37.         a3.pop();  
  38.     }  
  39.     return 0;     
  40. }  

\

\

问题描述:A×B 

计算两个非负整数 A,B 的乘积,A,B可能会很大。

输入格式

第一行输入一个非负整数A。

第二行输入一个非负整数 B。

A,B 的长度不大于 500。

输出格式

输出 A×B 的值。

样例输入
4321
1234
样例输出
5332114

\

代码解析:

[cpp]  view plain  copy

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. int main(){  
  4.     char str1[666],str2[666];//存放输入数字字符,分别为第一个乘数和第二个乘数   
  5.     int a1[666],a2[666];//对字符串倒置并依次存放每个字节  
  6.     int ans[1001]={0};//存放结果,初始为0   
  7.     int mod;//可以算是商   
  8.     int len1,len2,len3;  
  9.     //  
  10.     cin>>str1>>str2;  
  11.     //  
  12.     len1=strlen(str1);  
  13.     len2=strlen(str2);  
  14.     //  
  15.     for(int i=0;i<len1;i++){  
  16.         a1[len1-i]=str1[i]-'0';  
  17.     }  
  18.     for(int i=0;i<len2;i++){  
  19.         a2[len2-i]=str2[i]-'0';  
  20.     }  
  21.     //运算   
  22.     for(int i=1;i<=len1;i++){  
  23.         mod=0;  
  24.         for(int j=1;j<=len2;j++){  
  25.             ans[i+j-1]=a1[i]*a2[j]+mod+ans[i+j-1];  
  26.             mod=ans[i+j-1]/10;//商   
  27.             ans[i+j-1]=ans[i+j-1]%10;//模   
  28.         }  
  29.         ans[i+len2]=mod;//一次乘积后至多会多出来一位   
  30.     }  
  31.     len3=len1+len2;  
  32.     while(ans[len3]==0&&len3>1)  
  33.     len3--;  
  34.     for(int i=len3;i>0;i--){  
  35.         cout<<ans[i];  
  36.     }  
  37.     return 0;   
  38. }