//深刻认识到自己的粗心,为此浪费了一天。。

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

这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。



现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
 
Input
本题目包含多组测试数据,请处理到文件结束。

每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
 
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
 
Sample Input
  1. 1.1 2.9
  2. 1.1111111111 2.3444323343
  3. 1 1.1
 
Sample Output
  1. 4
  2. 3.4555434454
  3. 2.1
 
Author
linle
 

/*************************

继续大数,这次是大 小数,

我用了一个结构体 分别存放 小数的  整数部分 和 小数部分,两个数组,分别相加,进位 分别处理,同时要注意  
前导0   和  后导0
 的处理。。详细看代码

************************/

  1. // 小数 位的加法有问题
  2.  
  3. #include <iostream>
  4. #include <string.h>
  5. #include <stdio.h>
  6. using namespace std;
  7. #define N 8000
  8. struct Bint// 大数的结构体
  9. {
  10. int high[N/2];// 存放整数位
  11. int low[N/2];// 存放小数位
  12. int p;// 整数位非零位数
  13. int del; // 小数位非零位数
  14. };
  15. int Find(char a,char str[])// 找小数点的位置,实际返回的是整数部分的位数
  16. {
  17. int i,len = strlen(str);
  18. for(i = 0;i<len;i++)
  19. if(str[i]==a)
  20. return i;
  21. return len;// 整数时直接返回 长度
  22. }
  23.  
  24. void print(struct Bint s)// 输出函数
  25. {
  26. int i;
  27. for(i = s.p-1;i>=0;i--)
  28. printf("%d",s.high[i]);
  29. if(s.del>0){
  30. printf(".");
  31. for(i = 0;i<s.del;i++)
  32. printf("%d",s.low[i]);
  33. }
  34. printf("\n");
  35. }
  36. void trans(Bint &a,char str[])// 将输入的字符串形式的数 转换为结构体
  37. {
  38. memset(a.high,0,sizeof(a.high));
  39. memset(a.low,0,sizeof(a.low));
  40. int len = strlen(str);
  41. a.p = Find('.',str);
  42. a.del = (len==a.p)?0:(len-a.p-1);// 如果包含小数点则小数位数为 数的长度-整数位数-1
  43. int i=0,ii = 0,jj = 0,pa= a.p,l = len-1;
  44. while(str[i++]=='0'&&i<pa)// 去除前导0
  45. a.p--;
  46. while(str[l--]=='0'&&l>=pa)// 去除 后导 0
  47. a.del--;
  48. for(i = pa-1;i>=pa-a.p;i--)// 整数位赋值
  49. a.high[ii++] = str[i]-'0';
  50. for(i = pa+1;i<pa+1+a.del;i++)// 小数位 赋值
  51. a.low[jj++] = str[i]-'0';
  52. }
  53. void add(char A[],char B[])// 加法 代码核心
  54. {
  55. int i;
  56. Bint a,b,ans;// ans 存 结果
  57. memset(ans.low,0,sizeof(ans.low));
  58. memset(ans.high,0,sizeof(ans.high));
  59. trans(a,A);
  60. trans(b,B);
  61. ans.p = (a.p>b.p)?a.p:b.p;// 取a,b 整数位的最大值
  62. ans.del = (a.del>b.del)?a.del:b.del;// 同上,取小数位
  63. // 以下两个循环为逐位相加的过程
  64. for(i = 0;i<ans.p;i++)
  65. ans.high[i] = a.high[i]+b.high[i];
  66. for(i = 0;i<ans.del;i++)
  67. ans.low[i] = a.low[i]+b.low[i];
  68. // 进位处理
  69. for(i = ans.del-1;i>0;i--)
  70. {
  71. if(ans.low[i]>=10)
  72. {
  73. ans.low[i-1]+=ans.low[i]/10;
  74. ans.low[i]%=10;
  75. }
  76. }
  77. //小数位第一位有进位时的处理
  78. if(ans.low[0]>=10)
  79. {
  80. ans.high[0]+=ans.low[0]/10;
  81. ans.low[0]%=10;
  82. }
  83. for(i = 0;i<ans.p;i++)
  84. {
  85. if(ans.high[i]>=10)
  86. {
  87. ans.high[i+1]+=ans.high[i]/10;
  88. ans.high[i]%=10;
  89. }
  90. }
  91. if(ans.high[ans.p]>0)
  92. ans.p+=1;
  93. // 相加以后产生后导 0 的处理
  94. while(ans.low[ans.del-1]==0)
  95. ans.del--;
  96. print(ans);
  97. }
  98. int main()
  99. {
  100. char A[N],B[N];
  101. while(cin>>A>>B)
  102. {
  103. add(A,B);
  104. }
  105. return 0;
  106. }

hdu 1753 大明A+B(高精度小数加法)的更多相关文章

  1. HDU 1753 大明A+B (大正小数加法、字符串处理)

    大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. FZU 2032 高精度小数加法

    题目描写很没意思..就是说给出n个小数 求它们的总和 因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double ...

  3. hdoj 1753 大明A+B 高精度/java

    大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. [HDOJ] 1753.大明A+B (大数加法)

    Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...

  5. hdu 1753 大明A+B

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1753 容易出错的事例: 0.1 0.2 1.88 22.22 1 0.01 大概出错的几个点,做久了思维根 ...

  6. hdu 1753 大明A+B(大数)

    题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...

  7. HDU 1753 大明A+B(字符串模拟,简单题)

    简单题,但要考虑一些细节: 前导0不要,后导0不要,小数长度不一样时,有进位时,逆置处理输出 然后处理起来就比较麻烦了. 题目链接 我的代码纯模拟,把小数点前后分开来处理,写的很繁杂,纯当纪念——可怜 ...

  8. hdu 1316 How many Fibs?(高精度斐波那契数)

    //  大数继续 Problem Description Recall the definition of the Fibonacci numbers:  f1 := 1  f2 := 2  fn : ...

  9. BigDecimal类(高精度小数)

    位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * ...

随机推荐

  1. Xcode8 创建NSManageObject subclass方法

    更新iOS8之后发现coredata也做了一些改变,创建本地的时候一脸懵逼,最后发现: 喜极而泣不能自已,(-.-!)

  2. lunix机器的jdk安装

    本来不想写这篇博客的,写在这儿只是作为自己的笔记,jdk安装了千万编,但是踩过的坑老是不记,看别人的博客又各种不爽,所有索性自己写一个得了.老规矩,无图. Oracle版本的jdk下载地址:http: ...

  3. C#实现在Winform中嵌入Word和Excel

    http://www.cnblogs.com/wuzi145/archive/2012/05/08/2490680.html 在此只是介绍一个简单控件:dsoframer.ocx的使用,这个控件需要通 ...

  4. PHP 环境塔建与数据类型转换

    手动塔建PHP开发环境 安装php c:\apps\php 安装apache c:\apps\apache 1.配制apache 配制c:\apps\apache\conf\httpd.conf Do ...

  5. 定时自动同步文件,支持多文件夹同步,支持过滤文件和文件夹,解决FileSystemWatcher多次文件触发事件(源码)

    博客园里面有很多同步工具和软件,关于FileSystemWatcher类解释的也很多,但收集了很多文章后,感觉没好的方法,自己没事写了一个定时文件同步,借鉴了很多博客园朋友的东西: 上主菜: 配置文件 ...

  6. Win7家庭普通版、家庭高级版、专业版、旗舰版版本差别

    刚才我们发了一个大图片:<Windows7.Vista.XP 三大系统功能差异比较一览图>,现在,再发一张对比图片,简要的看看Windows7家庭普通版.家庭高级版.专业版.旗舰版这四个版 ...

  7. iOS给背景添加点击事件

    当点击背景的时候出发事件,或者跳转界面或者产生其他的响应 -(void)viewDidLoad { UIImageView * imageView  = [UIImageView alloc]init ...

  8. Distributed locks with Redis--官方

    原文:http://redis.io/topics/distlock Distributed locks with Redis Distributed locks are a very useful ...

  9. Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理

    Fixflow内核运转图v1.0(beta) 未完待续.........

  10. IIS 之 启用日志记录

    如何为网站启用日志记录或 在 Microsoft Internet Information Services (IIS) 6.0 中,在 IIS 5.0 中,并在 IIS 4.0 中的FTP 站点.可 ...