A+B Problem IV
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
-
输入
-
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
- 每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。 样例输入
-
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
样例输出
-
2 1 3.33
7
-
-
这题思路很好想,但细节太多尤其是小数点的问题,处理不好就容易出错
-
//思路:定义两个800的数组分别储存两个数,以400 401为界分成小数点前后两部分,进行逐位运算 #include <stdio.h> #include <string.h> char a[410],b[410]; int main() { while(~scanf("%s %s",a,b)) { int i,j,k=0,ba=0,bb=0; int a1[810] = {0}; int b1[810] = {0}; int la = strlen(a),lb = strlen(b);//A B 的长度 for(i=1;i<la;i++ ) if(a[i] == '.') //小数点位置 { ba=i; break; } if(ba != 0) //有小数点 { k=400; for(i=ba-1;i>=0;i--) { a1[k--] = a[i] - '0'; } k = 401; for(i=ba+1;i<la;i++) { a1[k++] = a[i] - '0'; } } else //没有小数点 { k=400; for(i=la-1;i>=0;i--) { a1[k--] = a[i] - '0'; } } for(i=1;i<lb;i++ ) //方法同A if(b[i] == '.') { bb=i; break; } if(bb != 0) { k=400; for(i=bb-1;i>=0;i--) { b1[k--] = b[i] - '0'; } k = 401; for(i=bb+1;i<lb;i++) { b1[k++] = b[i] - '0'; } } else { k=400; for(i=lb-1;i>=0;i--) { b1[k--] = b[i] - '0'; } } int t=0; for(i = 800;i >= 0;i -- ) //逆序对每一位加减 (正序存入的) { a1[i] = a1[i] + b1[i] + t; t = a1[i] / 10; a1[i] = a1[i] % 10; } for(i=0;i<401 && a1[i] == 0 ;i ++ ); //查找输出入口 if(i == 401) //整数全为0,输出0 printf("0"); for(;i<401;i ++ ) printf("%d",a1[i]); for(i=800;i>400 && a1[i] ==0 ;i--); if(i != 400) //小数部分不全为零输出小数点 printf("."); for(j=401;j<=i;j++) //输出小数部分 printf("%d",a1[j]); printf("\n"); } return 0; }
-
-
//分开存(更麻烦) #include <stdio.h> #include <string.h> int main() { char a[410],b[410]; while( ~scanf("%s %s",a,b) ) { int la = strlen(a); int lb = strlen(b); int bit1=la,bit2=lb,i,j=0,k=0,fa=1,fb=1; int a1[410] = {0},a2[410] = {0}; int b1[410] = {0},b2[410] = {0}; for(i=la-1;i>=0;i--) if(a[i]=='.') { bit1=i; break; } for(i=bit1-1;i>=0;i--) { a1[j++] = a[i] - '0'; } if(bit1!=la) for(i=bit1+1;i<la;i++) { a2[k++] = a[i] - '0'; } j=k=0; for(i=lb-1;i>=0;i--) if(b[i]=='.') { bit2=i; break; } for(i=bit2-1;i>=0;i--) { b1[j++] = b[i] - '0'; } for(i=bit2+1;i<lb;i++) { b2[k++] = b[i] - '0'; } int s,t=0; for(i=0;i<401;i++) { s = a1[i]+b1[i]+t; a1[i] = s%10; t = s/10; } t=0; for(i=400;i>=0;i--) { s = a2[i]+b2[i]+t; a2[i] = s%10; t = s/10; } a1[0]+=t; for(i=0;i<401;i++) if(a1[i]>9) { a1[i]%=10; a1[i+1]+=1; } for(j=400;j>=0 && a1[j]==0;j--); if(j == -1)printf("0"); for(i=j;i>=0;i--) printf("%d",a1[i]); for(j=400;j>=0 && a2[j]==0;j--); if(j != -1) printf("."); for(i=0;i<=j;i++) printf("%d",a2[i]); printf("\n"); } return 0; }
import java.util.Scanner; import java.math.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigDecimal d1, d2, temp = new BigDecimal("0.0"); while(in.hasNextBigDecimal()){ d1 = in.nextBigDecimal(); d2 = in.nextBigDecimal(); d1 = d1.add(d2); String s = d1.stripTrailingZeros().toPlainString(); //将结果去除小数点后面多余的零之后转换为字符串的形式 if(d1.compareTo(temp) == 0){ //特殊情况答案是0的时候 System.out.println("0"); }else{ System.out.println(s); } } in.close(); } }
-
-
包含多组测试数据