1125: 高精度高精度减法
题目描述
输入两个正整数(最多1000位),输出它们的差。
输入
两行,两个整数
输出
一行,一个整数
样例输入
999
1000
样例输出
-1
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #define SIZE 100001 5 using namespace std; 6 char sa[SIZE],sb[SIZE]; 7 int a[SIZE],b[SIZE],c[SIZE]; 8 int alen,blen,clen,i,j; 9 int cmp(string a,string b) 10 { 11 if(strlen(sa)>strlen(sb))return 1; 12 else if(strlen(sa)<strlen(sb))return -1; 13 else 14 { 15 int i,l=strlen(sa); 16 for(i=0;i<l;i++) 17 { 18 if(sa[i]>sb[i])return 1; 19 else if(sa[i]<sb[i])return -1; 20 } 21 } 22 return 0; //这个函数是为了比较两个数字的大小,位数大的数当然他就大,若位数相同则诸位比较。 23 } 24 int main() 25 { 26 cin>>sa>>sb; 27 if(cmp(sa,sb)==0) //等于零的时候说明两个数的大小是相同 28 { 29 cout<<0; 30 return 0; 31 } 32 else if(cmp(sa,sb)==-1) //第一个数比第二个数大,结果必然是负数 33 { 34 cout<<'-'; 35 char t[SIZE]; 36 strcpy(t,sa); 37 strcpy(sa,sb); 38 strcpy(sb,t); //把第一个数和第二个数互换 39 } 40 alen=strlen(sa); 41 blen=strlen(sb); 42 clen=max(alen,blen); //结果的位数最大和最大位数相同 43 for(i=0;i<alen;i++) 44 a[alen-i]=sa[i]-'0'; 45 for(i=0;i<blen;i++) 46 b[blen-i]=sb[i]-'0'; //倒叙,把字符改为数字 47 for(i=1;i<=clen;i++) 48 c[i]=a[i]-b[i]; 49 for(i=1;i<=clen;i++) 50 if(c[i]<0) 51 c[i]+=10,c[i+1]--;//减法竖式的补位 52 while(c[clen]==0&&clen>1)clen--;//为了把前面多余的0去掉 53 for(i=clen;i>=1;i--) 54 cout<<c[i]; //倒叙输出数组。 55 cout<<endl; 56 }
**高精度加法,就是模拟竖式。1.比较数字大小,判断是否输出负号。
2.把大数放前小数放后
3.把字符串转化为数组,并且转化成计算用的数组顺序。
4.把数组相减,注意补位。
5.判断结果长度。
6.最后倒叙输出数字。
**这是标程,改天一定用自个写的孝敬这篇博客