nyoj A+B Problem IV【实数a+b】大数
发布时间:2020-12-14 02:10:29 所属栏目:大数据 来源:网络整理
导读:A+B Problem IV 时间限制: 1000 ?ms ?|? 内存限制: 65535 ?KB 难度: 3 描述 acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。 输入 包含多组测试数据 每组数据包含两个正数A,B(可能为小数且位数
A+B Problem IV
时间限制:
1000?ms ?|? 内存限制:
65535?KB
难度:
3
实数a+b,只针对整数的运算........ 很久以前就想尝试,今天终于搞出来了.......... 恶心的要死,调试了一下午,才把所有要考虑的情况考虑到.......... 其实就是字符串处理,主要是要注意各种特殊情况........... 献出几组测试数据: 0.1 0.02 0.1 0.9 1 2.0 1.9 0.1 9 10 1.23 2.1 1000 0.01 写的程序比较繁琐,完全是按自己的理解来做的.......... 以后有机会再优化吧........ #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; char a[1005],b[1005],sum[1005]; void mem() { memset(sum,sizeof(sum)); memset(a,sizeof(a)); memset(b,sizeof(b)); } void over(char s[]) { int len=strlen(s); for(int i=0;i<len/2;++i) { swap(s[i],s[len-i-1]); } } int point(char s[])//找小数点的位置 { int len=strlen(s); for(int i=0;i<len;++i) { if(s[i]=='.') { over(s); return len-i-1; } } s[len]='.';s[len+1]='0'; return point(s); } void move(char s[],int x) { int len=strlen(s); for(int i=len-1;i>=0;--i) { s[i+x]=s[i]; } while(x--) { s[x]='0'; } } void change(char s[]) { int len=strlen(s),cnt=0; for(int i=0;i<len;++i) { if(s[i]!='0'&&s[i]!='.') { break; } else { ++cnt; } if(s[i]=='.') { break; } } for(int i=cnt;i<len;++i) { s[i-cnt]=s[i]; } s[len-cnt]=0; over(s); } int main() { // freopen("shuju.txt","r",stdin); while(mem(),~scanf("%s%s",a,b)) { int pa=point(a),pb=point(b); if(pa>pb)//对位 { move(b,pa-pb); } else { move(a,pb-pa); } int cnt=0; for(int i=0;a[i]||b[i];++i)//累加 { if(a[i]!='.') { sum[i]+=a[i]-(a[i]?'0':0)+b[i]-(b[i]?'0':0); //++cnt; } else { sum[i]='.'; } ++cnt; } for(int i=0;i<cnt;++i)//进位 { if(sum[i]!='.') { if(sum[i+1]!='.') { sum[i+1]+=sum[i]/10; sum[i]%=10; } else { sum[i+2]+=sum[i]/10; sum[i]%=10; } sum[i]+='0'; } while(sum[cnt]) { ++cnt; } } change(sum);//调整 printf("%sn",sum); } return 0; } 大神的最优代码,然而并没有看懂....555 #include <stdio.h> #include <string.h> #define MAX 1000 char a[MAX],b[MAX],c[MAX]; int main() { int i,j,k,l,m,n,la,lb,mx; char ch; memset(a,'0',sizeof(b)); while(~scanf("%s%s",b)) { la=strlen(a); lb=strlen(b); a[la]='0'; b[lb]='0'; i=0; while((a[i]-'.')&&i<la) { i++; } if(i==la) a[la]='.'; j=0; while((b[j]-'.')&&j<lb) { j++; } if(j==lb) b[lb]='.'; m=(la-i)>(lb-j)?(la-i):(lb-j); if(i>=j) { for(l=mx=i+m,k=0,j=i-j;l>=0;l--) { if(a[l]=='.') { c[l]='.'; continue; } ch=(l-j)<0?'0':b[l-j]; c[l]=(a[l]-'0'+ch-'0'+k)%10+'0'; k=(a[l]-'0'+ch-'0'+k)/10; } } else { for(l=mx=j+m,j=j-i;l>=0;l--) { if(b[l]=='.') { c[l]='.'; continue; } ch=(l-j)<0?'0':a[l-j]; c[l]=(ch-'0'+b[l]-'0'+k)%10+'0'; k=(ch-'0'+b[l]-'0'+k)/10; } } if(k>0) printf("%d",k); while(c[mx]=='0') mx--; if(c[mx]=='.') mx--; for(i=0;i<=mx;i++) printf("%c",c[i]); printf("n"); memset(a,sizeof(a)); memset(b,sizeof(b)); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |