杭电 1753

本文介绍了一种处理长整数加法的方法,该方法能够处理长度不超过400位的正小数相加的问题。通过解析输入字符串并分别处理整数部分和小数部分,实现了加法运算并输出简化后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道简单题,不过是麻烦了点,就这样一道简单题,让我做了一上午,直到现在才做出来,这叫一个纠结啊。。。。。

题目:

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。


Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。


Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。


Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1


Sample Output
4 3.4555434454 2.1

ac代码:

#include <stdio.h> #include <string.h> int main() { char ch1[405],ch2[405]; while(scanf("%s%s",ch1,ch2)!=EOF) { int aa[405]={0},bb[405]={0},cc[405]={0},dd[405]={0},ee[405]={0},ff[405]={0}; int i,j,k=0,p=0,m=0,n=0,kk=0,pp=0,mm=0,nn=0; int lch1=strlen(ch1); int lch2=strlen(ch2); int flag=1; for(i=0;i<lch1;++i) { if(ch1[i]!='.'&&flag) { aa[k++]=ch1[i]-48; } if(ch1[i]=='.') flag=0; if(ch1[i]!='.'&&!flag) { bb[kk++]=ch1[i]-48; } } flag=1; for(j=0;j<lch2;++j) { if(ch2[j]!='.'&&flag) cc[p++]=ch2[j]-48; if(ch2[j]=='.') flag=0; if(ch2[j]!='.'&&!flag) { dd[pp++]=ch2[j]-48; } } flag=0; int max1; if(kk>pp) max1=kk; else max1=pp; while(max1>0) { ff[m]+=(bb[max1-1]+dd[max1-1]); if(ff[m]>=10) { ff[m]-=10; ff[m+1]+=1; flag=1; } else flag=0; max1-=1; m++; } if(flag==1) ee[0]+=1; while(k>0&&p>0) { ee[n]+=(aa[--k]+cc[--p]); if(ee[n]>=10) { ee[n]-=10; ee[n+1]+=1; } n++; } while(k) { ee[n]+=aa[--k]; if(ee[n]>=10) { ee[n]-=10; ee[n+1]+=1; } n++; } while(p) { ee[n]+=cc[--p]; if(ee[n]>=10) { ee[n]-=10; ee[n+1]+=1; } n++; } if(ee[n]==0) n-=1; for(i=n;i>=0;--i) { printf("%d",ee[i]); } for(i=0;i<m;++i) { if(ff[i]!=0) break; } if(i==m) printf("\n"); else { printf("."); for(j=m-1;j>=i;--j) printf("%d",ff[j]); printf("\n"); } } return 0; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值