51nod 1005 大数加法
2016-11-30 20:02
288 查看
题目链接:这里写链接内容
因为题目说给定的数可以是负数,就相当这个题包括了加法和减法
加法减法的借位原理都一样,中间改了n遍,终于过了
代码又臭又长代码如下:(这次加了注释进去)
因为题目说给定的数可以是负数,就相当这个题包括了加法和减法
加法减法的借位原理都一样,中间改了n遍,终于过了
代码又臭又长代码如下:(这次加了注释进去)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 10100 char a ,b ,c ; int main(){ int i,j,n,m,x; while(scanf("%s %s",a,b)!=EOF){ memset(c,0,sizeof(c)); int len1=strlen(a); int len2=strlen(b); int flag1=0; if(a[0]!='-'&&b[0]!='-'||a[0]=='-'&&b[0]=='-'){ //正数加法和负数加法,其符号不改变 if(len1>len2){ //将长的数放在下面 swap(a,b); int t=len1; len1=len2;len2=t; } for(i=0;i<len1/2;i++) //flag1为符号位 swap(a[i],a[len1-i-1]); for(i=0;i<len2/2;i++) swap(b[i],b[len2-i-1]); if(a[len1-1]=='-'){ len1--,len2--; flag1=1; } int flag=0,len=0; //flag判断是否进位,进位为1 for(i=0;i<len1;i++){ x=a[i]-'0'+b[i]-'0'; if(x<10&&flag==0){ c[len++]=x+'0'; continue; } else if(x>=10&&flag==0){ flag=1; x-=10; c[len++]=x+'0'; continue; } else if(x+1>=10&&flag==1){ x-=9; c[len++]=x+'0'; if(c[len-1]>'9'||c[len-1]<'0') c[len-1]='0'; continue; } else if(x+1<10&&flag==1){ x+=1; flag=0; c[len++]=x+'0'; continue; } } if(len1!=len2) for(i=len1;i<len2;i++){ if(flag){ x=b[i]-'0'+1; if(x>=10){ x-=10; c[len++]=x+'0'; continue; } if(x<10){ c[len++]=x+'0'; flag=0; continue; } } if(flag==0){ c[len++]=b[i]; } } if(len1==len2){ if(flag==1){ c[len++]=1+'0'; flag=0; } } if(flag) c[len++]=1+'0'; if(flag1) cout<<"-"; for(i=len-1;i>=0;i--) cout<<c[i]; cout<<endl; } else { //正数和负数的相加 int len=0; if(len1<len2){ //将长的放在上面 swap(a,b); int t=len1; len1=len2;len2=t; } if(a[0]=='-'&&len1>len2+1) flag1=1; if(len1==len2+1&&a[0]=='-'){ for(i=1;i<len1;i++){ if(a[i]>b[i-1]){ flag1=1; break; } if(a[i]<b[i 4000 -1]){ flag1=0; break; } } if(flag1==0){ //将下面的数往右移,使其和上面的数右对齐,便于做减法 for(i=0;i<=len1-2;i++) a[i]=a[i+1]; len1=len2; swap(a,b); } } if(len1==len2&&a[0]=='-'){ swap(a,b); flag1=0; } for(i=len1-1,j=len2-1;j>=0;i--,j--) b[i]=b[j]; // for(i=0;i<len1;i++)cout<<b[i];cout<<endl; int flag=0; for(i=len1-1;i>len1-len2-1;i--){ //借位与加法进位原理相同 if(a[i]=='-'||b[i]=='-') break; x=(a[i]-'0')-(b[i]-'0'); if(x>=0&&flag==0){ c[len++]=x+'0'; continue; } if(x<0&&flag==0){ flag=1; x=10-(b[i]-'0')+(a[i]-'0'); c[len++]=x+'0'; continue; } if(x-1>=0&&flag){ flag=0; c[len++]=(x-1+'0'); continue; } if(x-1<0&&flag){ x=10-(b[i]-'0')+(a[i]-'0')-1; c[len++]=x+'0'; continue; } } // for(i=0;i<=len-1;i++) cout<<c[i]<<endl; for(;i>=0;i--){ if(a[i]=='-') break; if(flag){ flag=0; x=(a[i]-'0')-1; if(x<0) {x=9;flag=1;} c[len++]=(x+'0'); } else c[len++]=a[i]; } //for(i=0;i<len;i++) cout<<c[i]<<endl; if(flag1) cout<<"-"; flag=1; for(i=len-1;i>=0;i--){ if(c[i]=='0'&&flag) continue; if(c[i]!='0'&&flag) flag=0; if(flag==0) cout<<c[i]; } cout<<endl; } } return 0; }
相关文章推荐
- 【51nod】1005 大数加法
- 51Nod 1005 大数加法
- 51nod_1005 大数加法
- 大数高精度加减乘除 51nod 1005 大数加法
- 51nod 1005 大数加法(可为负数)
- 51Nod-1005-大数加法
- 51nod 1005 大数加法
- 51Nod-1005 大数加法
- 51nod 1005 大数加法(可为负数)
- 51Nod--1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod-1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法
- 51Nod-1005-大数加法
- 51Nod 1005 大数加法
- 51Nod-1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法 大数运算