Codeup100000593问题 C: 浮点数加法

    技术2025-03-06  36

    题目描述:

    求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0

    输入:

    对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。 每组测试数据之间有一个空行,每行数据不超过100个字符

    输出:

    每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数

    样例输入:

    2 3.756 90.564 4543.5435 43.25

    样例输出:

    94.32 4586.7935

    实现代码:

    #include <cstdio> #include <cstdlib> #include <ctime> #include <cstring> #include <algorithm> #include <math.h> using namespace std; struct bign{ int d1[100]; //存储整数部分 int len1; //整数长度 int d2[100]; //存储小数部分 int len2; //小数长度 bign(){ memset(d1,0,sizeof(d1)); len1=0; memset(d2,0,sizeof(d2)); len2=0; } }; bign change(char str[]){ bign a; int len=strlen(str); int i; for(i=0;i<len&&str[len-1-i]!='.';i++){ a.d2[i]=str[len-1-i]-'0'; } a.len2=i; for(int k=0;k<a.len2/2;k++){ int temp=a.d2[k]; a.d2[k]=a.d2[a.len2-k-1]; a.d2[a.len2-k-1]=temp; } a.len1=len-i-1; int j=0; for(i=i+1;i<len;i++){ a.d1[j++]=str[len-i-1]-'0'; } return a; } bign add(bign a,bign b){ bign c; int carry=0; // 小数加法 for(int i=a.len2-1>b.len2-1?a.len2-1:b.len2-1;i>=0;i--){ int temp=a.d2[i]+b.d2[i]+carry; c.d2[c.len2++]=temp%10; carry=temp/10; } for(int k=0;k<c.len2/2;k++){ int temp=c.d2[k]; c.d2[k]=c.d2[c.len2-k-1]; c.d2[c.len2-k-1]=temp; } // 去掉小数点后多余的0 while(c.len2-1>0&&c.d2[c.len2-1]==0){ c.len2--; } // 整数加法 for(int i=0;i<a.len1||i<b.len1;i++){ int temp=a.d1[i]+b.d1[i]+carry; c.d1[c.len1++]=temp%10; carry=temp/10; } if(carry!=0){ c.d1[c.len1++]=carry; } return c; } void print(bign a){ for(int i=a.len1-1;i>=0;i--){ printf("%d",a.d1[i]); } printf("."); for(int i=0;i<a.len2;i++){ printf("%d",a.d2[i]); } } int main(){ char str1[110]; char str2[110]; int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%s",&str1); scanf("%s",&str2); bign a=change(str1); bign b=change(str2); print(add(a,b)); printf("\n"); } } return 0; }
    Processed: 0.011, SQL: 9