Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。

这时他已经不是那个只会做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


思路:小数整数分开计算,先计算小数(注意后导0和全为0情况,例如1.2000000  1.0)。再计算整数(注意前导0和只有0情况),整数输出部分真的是搞死了,对于极端情况还是欠考虑,不好设置其中的开关条件
附上借鉴的大佬解法:感谢大佬

代码:
#include<stdio.h>
#include<string.h>
int main()
{
char a[410],b[410];
int a1[410],a2[410],b1[410],b2[410],p1,p2,lena,lenb,i,j,point1,point2;
while(scanf("%s%s",a,b)!=EOF)
{
memset(a1,0,sizeof(a1));//整数
memset(a2,0,sizeof(a2));//小数
memset(b1,0,sizeof(b1));//整数
memset(b2,0,sizeof(b2));//小数
lena=strlen(a);
lenb=strlen(b);
p1=lena;
for(i=0;i<lena;i++){
if(a[i]=='.'){
p1=i; //整数长度
break;
}
}
p2=lenb;
for(i=0;i<lenb;i++){
if(b[i]=='.'){
p2=i; //整数长度
break;
}
}
for(i=0;i<p1;i++){
a1[p1-1-i]=a[i]-'0'; // 整数转移 (倒置)
}
for(j=0,i=p1+1;i<lena;i++,j++){
a2[j]=a[i]-'0'; //小数转移
}
for(i=0;i<p2;i++){
b1[p2-1-i]=b[i]-'0'; // 整数转移 (倒置)
}
for(j=0,i=p2+1;i<lenb;i++,j++){
b2[j]=b[i]-'0'; //小数转移
} for(i=400;i>0;i--){ //小数相加
a2[i]=a2[i]+b2[i];
if(a2[i]>=10){
a2[i]-=10;
a2[i-1]++;
}
}
a2[i]=a2[i]+b2[i];
if(a2[i]>=10){
a2[i]-=10;
a1[0]++;
}
point1=-1;
for(i=400;i>=0;i--){ //小数除去后导0
if(a2[i]!=0){
point1=i; //找到小数最末尾不为0的位置
break;
}
}
lena=p1;lenb=p2;
int len=lena>lenb?lena:lenb; //整数相加
for(i=0;i<len;i++){
a1[i]+=b1[i];
if(a1[i]>=10){
a1[i]-=10;
a1[i+1]++;
}
}
point2=0;
for(j=i;j>=0;j--){ //判断、除去前导0
if(a1[j]!=0){
point2=1;
}
if(point2){
printf("%d",a1[j]);
}
}
if(point2==0){
printf("0");
}
if(point1!=-1){
printf(".");
for(i=0;i<=point1;i++){
printf("%d",a2[i]);
}
}
printf("\n");
}
return 0;
}

终于搞腚了




最新文章

  1. C语言获取时间
  2. P3381 【模板】最小费用最大流
  3. jquery send(data) 对data的处理
  4. C#字符串的恒定性
  5. ie8不支持transform: translateY,ie9支持不友好
  6. 转!sqlServer2000 表连接查询
  7. Oracle Group by+rollup+cube 的应用
  8. 常用的Python字符串常量
  9. Android 自学之对话框
  10. c++截取屏幕图片并保存(函数代码实现)
  11. SQLServer 取小时
  12. DLL注入_拦截技术之Hook方式
  13. 8259A工作原理描述
  14. C#中ListView易错的方法
  15. Java Map对象的遍历
  16. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)
  17. python基础之Day17
  18. Ramnit 蠕虫分析
  19. MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
  20. fabric默认样例的分析

热门文章

  1. java中的锁之AbstractQueuedSynchronizer源码分析(二)
  2. 软工网络15团队作业4——Alpha阶段敏捷冲刺1.0
  3. binTreePosterorderTraversal二叉树的后序遍历
  4. SQLGetEnvAttr
  5. Sql日期时间格式转换[zhuan]
  6. Abandoned country(最小生成树+树形DP)
  7. 使用js实现登录随机验证码的效果
  8. [转载]WeeksInAYear、WeeksInYear、DaysInAYear、DaysInAMonth、DaysInYear、DaysInMonth - 获取指定年月的周、日数
  9. 关于js的日期处理
  10. MyEclipse项目的jquery.js发生[Multiple markers at this line - Missing semicolon]的解决方案