问题 D: 【高精度】减法神童
时间限制: 1 Sec 内存限制: 64 MB提交: 7 解决: 5
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
在科学城里住着一位减法神童,他可以在一秒钟内算出两个数相减的结果。这两个数可不是普通的数字,它们是11位以上的“宠然大物”。为了证明自己神奇的计算能力,减法神童请全城的人都来出题考自己,只要答错一题他就自愿放弃“减法神童”的称号。
你想考考减法神童吗?还是先编写一个程序帮我们算出任意两个11位以上的数相减的精确结果吧。
输入
第1行是被减数A,第2行是减数B(A,B的位数大于11,小于200)。
输出
A-B的结果。
样例输入
5894379463257
1245648324567
样例输出
4648731138690
1 #include <iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 string s,t; 6 int a[5005],b[5005],c[5005]; 7 int main() 8 { 9 cin>>s>>t; 10 int len1=s.size(),len2=t.size(); 11 for(int i=len1-1;i>=0;i--) 12 a[len1-i-1]=s[i]-'0'; 13 for(int i=len2-1;i>=0;i--) 14 b[len2-i-1]=t[i]-'0'; 15 int len=max(len1,len2); 16 for(int i=0;i<len;i++) 17 { 18 c[i]+=(a[i]+b[i]); 19 if(c[i]>9) 20 { 21 c[i]-=10; 22 c[i+1]++; 23 } 24 } 25 if(c[len]!=0) 26 { 27 len++; 28 } 29 for(int i=len-1;i>=0;i--) 30 cout<<c[i]; 31 cout<<endl; 32 return 0; 33 }
由于疏忽,上面代码贴成了加法的,现已更改为减法,代码如下(感谢杨翰齐指出错误)
1 #include <iostream> 2 #include<string> 3 using namespace std; 4 string s,t; 5 int a[300],b[300],c[300]; 6 int main() 7 { 8 cin>>s>>t; 9 int len1=s.size(); 10 int len2=t.size(),len; 11 if(s==t) 12 { 13 cout<<"0"<<endl; 14 return 0; 15 } 16 if((len1==len2&&s<t)||len1<len2) 17 { 18 cout<<"-"; 19 string temp; 20 temp=s; 21 s=t; 22 t=temp; 23 len=len2; 24 swap(len1,len2); 25 } 26 len=len1; 27 for(int i=len1-1;i>=0;i--){ 28 a[len1-i-1]=s[i]-'0'; 29 } 30 for(int i=len2-1;i>=0;i--) 31 b[len2-i-1]=t[i]-'0'; 32 for(int i=0;i<len;i++) 33 { 34 c[i]+=(a[i]-b[i]); 35 if(c[i]<0) 36 { 37 c[i]+=10; 38 c[i+1]--; 39 } 40 } 41 while(c[len]==0) 42 { 43 len--; 44 } 45 for(int i=len;i>=0;i--) 46 cout<<c[i]; 47 cout<<endl; 48 // cout << "Hello world!" << endl; 49 return 0; 50 }