小数A+B
Description
给你两个正的小数A和B,你的任务是计算出A+B的值。
************************************************************************************************
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
************************************************************************************************
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
************************************************************************************************
1.1 2.9
1.1111111111 2.3444323343
1 1.1
************************************************************************************************
4
3.4555434454
2.1
************************************************************************************************
思路,就是按照两数相减的思路,就可以了。我采用的c语言版的!
************************************************************************************************
代码如下:
#include<stdio.h> #include <iostream> #include <string.h> using namespace std; char a[405],b[405]; char x[200],y[200],z[200],k[200]; int p[405],q[405]; ///判断是不是含有小数点,随便解决多余的0 int fun(char s[]) { int q=0; for(int i=0; i<strlen(s); i++) { if(s[i]=='.') { q = i; break; } } if(q==1) { int i=strlen(s)-1; while(s[i]=='0') { s[i] = '\0'; i--; } if(s[i]=='.') { s[i]='\0'; return 0; } } return q; } void cmp(int lena,int t) { if(t==1) { ///表示有小数点, if(lena!=0) { for(int i=0; i<lena; i++) x[i] = a[i]; x[lena] = '\0'; int j=0; for(int i=lena+1; i<strlen(a); i++,j++) y[j] = a[i]; y[j]='\0'; } else ///无小数点 strcpy(x,a); } else { ///表示有小数点, if(lena!=0) { for(int i=0; i<lena; i++) z[i] = b[i]; z[lena] ='\0'; int j=0; for(int i=lena+1; i<strlen(b); i++,j++) k[j] = b[i]; k[j]='\0'; } else ///无小数点 strcpy(z,b); } } void xiangjia(int len,int num,int t) { int o = num-1; if(t==1) { for(int i = len-1 ; i>=0 ; i--,o--) p[o] = x[i]-'0'; for(int i = 0 ; i<strlen(z) ; i++) p[i] += z[i]-'0'; } else { for(int i = len-1 ; i>=0 ; i--,o--) p[o] = z[i]-'0'; for(int i = 0 ; i<strlen(x) ; i++) p[i] += x[i]-'0'; } } int wh(int l) { int index =0; int i; for( i = l-1; i>=0; i--) { if(q[i] == 0 && index==0) continue; else break; } for(int j=0; j<=i; j++) { if(index==0) { printf("."); index=1; } printf("%d",q[j]); } printf("\n"); } int main() { int lena,lenb; while(scanf("%s %s",&a,&b)!=EOF) { memset(x,0,sizeof(x)); memset(z,0,sizeof(z)); memset(y,0,sizeof(y)); memset(k,0,sizeof(k)); memset(q,0,sizeof(q)); memset(p,0,sizeof(p)); int funa = fun(a); int funb = fun(b); cmp(funa,1); cmp(funb,2); ///前面一部分相加的结果 int lenx = strlen(x); int lenz = strlen(z); int j = lenx>lenz?lenx:lenz; if(j!=lenx) xiangjia(lenx,j,1); else xiangjia(lenz,j,2); for(int i=j-1; i>0; i--) { if(p[i]>=10) { p[i-1]+=p[i]/10; p[i]=p[i]%10; } } ///后一部分相加的结果 int l = strlen(k)>strlen(y)?strlen(k):strlen(y); for(int i=0; i<strlen(k); i++) q[i] = k[i]-'0'; for(int i=0; i<strlen(y); i++) q[i] += y[i]-'0'; ///之前的 for(int i=l-1; i>0; i--) { if(q[i]>=10) { q[i-1] += q[i]/10; q[i] = q[i]%10; } } ///合并了得最后的值 if(q[0]>=10) { int num = q[0]/10; q[0] = q[0]%10; int i = j-1; p[i] += num; while(p[i]>=10 && i>0) { p[i-1] += p[i]/10; p[i] = p[i]%10; i--; } } ///输出前面的头部 for(int i=0; i<j; i++) printf("%d",p[i]); ///尾部调用输出 wh(l); } return 0; }