对于每组案例,每组测试数据占2行,分别是两个加数。
每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数
0.111111111111111111111111111111 0.111111111111111111111111111111
0.222222222222222222222222222222
#include<stdio.h> #include<string.h> int main(void){ char a[100],b[100]; scanf("%s %s",a,b); int len1,len2; len1=strlen(a); len2=strlen(b); int jinwei=0; int ap,bp; //找小数点的位置 for(int i=0;i<len1;i++){ if(a[i]=='.'){ ap=i; } } for(int i=0;i<len2;i++){ if(b[i]=='.'){ bp=i; } } //先计算小数部分 //对长度较短的那个数进行扩充 int _len1=len1-ap-1; int _len2=len2-bp-1; int cha; int z_len; if(_len1>_len2){ cha=_len1-_len2; for(int i=len2;i<len2+cha;i++){ b[i]='0'; } z_len=_len1; }else{ cha=_len2-_len1; for(int i=len1;i<len1+cha;i++){ a[i]='0'; } z_len=_len2; } int sum[z_len]; int temp=0; int xs_jw; for(int i=z_len-1;i>-1;i--){ sum[i]=(a[ap+i+1]-48+b[bp+i+1]-48+temp)%10; temp=(a[ap+i+1]-48+b[bp+i+1]-48+temp)/10; } xs_jw=temp; // printf("小数部分相加结果:\n"); // for(int i=0;i<z_len;i++){ // printf("%d ",sum[i]); // } // printf("\n"); // printf("小数部分相加进位:\n"); // printf("%d",xs_jw); // printf("\n"); //再计算整数部分 //在短的前面补零 int zz_len; if(ap>bp){ //b较短 zz_len=ap; cha=ap-bp; for(int i=bp-1;i>-1;i--){ b[i+cha]=b[i]; } //补充前面的0 for(int i=0;i<cha;i++){ b[i]='0'; } }else{ zz_len=bp; cha=bp-ap; for(int i=ap-1;i>-1;i--){ a[i+cha]=a[i]; } //补充前面的0 for(int i=0;i<cha;i++){ a[i]='0'; } } int sum2[zz_len]; int temp2=xs_jw; int zs_jw; for(int i=zz_len-1;i>-1;i--){ sum2[i]=(a[i]-48+b[i]-48+temp2)%10; // printf("%d ",sum2[i]); temp2=(a[i]-48+b[i]-48+temp2)/10; // printf("%d ",temp2); // printf("\n"); } zs_jw=temp2; // printf("整数部分相加结果:\n"); // for(int i=0;i<zz_len;i++){ // printf("%d ",sum2[i]); // } // printf("\n"); // printf("整数部分相加进位:\n"); // printf("%d",zs_jw); // printf("\n"); // printf("最后的结果:"); if(zs_jw!=0){ printf("%d",zs_jw); } for(int i=0;i<zz_len;i++){ printf("%d",sum2[i]); } printf("."); for(int i=0;i<z_len;i++){ printf("%d",sum[i]); } return 0; }