http://acm.hdu.edu.cn/showproblem.php?

pid=1753

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 8296    Accepted Submission(s): 2929

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
 
思路清晰。算法仅仅用到了大数,但里边须要注意的地方非常多

先计算小数位的和,由于十分位可能向各位进位,进位时a[0]+=1即可。然后后边直接用;

然后计算整数位的和。也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
代码后边附几组数据,这些过了应该就能够AC
  1. /*思路清晰,算法仅仅用到了大数,但里边须要注意的地方非常多
  2. 先计算小数位的和。由于十分位可能向各位进位,进位时a[0]+=1即可,然后后边直接用;
  3. 然后计算整数位的和,也就是大数相加,仅仅是应该注意把字符串中的数存到a[]时。要写成a[j]+=s1[i]-'0',由于要考虑进位
  4. */
  5. #include<stdio.h>
  6. #include<string.h>
  7. #define MAX 450
  8. int main()
  9. {
  10. int a[MAX],b[MAX],num_1[MAX],num_2[MAX],i,j,k,n;
  11. char s1[MAX],s2[MAX];
  12. while(~scanf("%s %s",s1,s2))
  13. {
  14. memset(num_1,0,sizeof(num_1));
  15. memset(num_2,0,sizeof(num_2));
  16. memset(a,0,sizeof(a));
  17. memset(b,0,sizeof(b));
  18. n=strlen(s1);
  19. for(i=0;i<n;i++)//s1[i]为小数点
  20. if(s1[i]=='.') break;
  21. for(k=0,j=n-1;j>i;j--,k++)//s1有k位小数
  22. num_1[k]=s1[j]-'0';
  23. int i_1=i,k_1=k,n_1=n;
  24.  
  25. n=strlen(s2);
  26. for(i=0;i<n;i++)//s2[i]为小数点
  27. if(s2[i]=='.') break;
  28. for(k=0,j=n-1;j>i;j--,k++)//s2有k位小数
  29. num_2[k]=s2[j]-'0';
  30. int i_2=i,k_2=k,n_2=n;
  31. if(k_1>=k_2)//小数相加,注意十分位进位的情况 //分两这情况(k_1>=k_2)和(k_1<k_2)是由于不确定哪个小数点后的位数大
  32. {//假设k_1>=k_2,把计算的结果放到num_1[]中
  33. for(i=k_1-k_2,j=0;i<k_1;i++,j++)
  34. {
  35. num_1[i]+=num_2[j];
  36. if(num_1[i]>=10)
  37. {
  38. num_1[i]-=10;
  39. num_1[i+1]+=1;
  40. }
  41. //printf("%d#\n",num_1[i]);
  42. }
  43. if(num_1[i]==1)//十分位进到个位
  44. {
  45. num_1[i]-=1;
  46. a[0]+=1;
  47. }
  48. }
  49. else if(k_2>k_1)//假设k_2>k_1,把计算的结果放到num_2中。
  50.  
  51. {
  52. for(i=k_2-k_1,j=0;i<k_2;i++,j++)
  53. {
  54. num_2[i]+=num_1[j];
  55. if(num_2[i]>=10)
  56. {
  57. num_2[i]-=10;
  58. num_2[i+1]+=1;
  59. }
  60.  
  61. }
  62. if(num_2[i]==1)//十分位进到个位
  63. {
  64. num_2[i]-=1;
  65. a[0]+=1;
  66. }
  67. }
  68. //上边小数位相加分两种情况。下边小数位的输出也分两种情况
  69.  
  70. for(j=0,i=i_1-1;i>=0;i--,j++)//这里是a[j]+=s1[i]-'0',由于考虑到小数会给a[0]进位。
  71.  
  72. a[j]+=s1[i]-'0'; //这里事实上仅仅给a[0]+=s1[o]-'0',其余还是a[j]=s1[i]-'0',仅仅是这样写和把a[0]独分出来效果一样,就这样写了
  73. for(j=0,i=i_2-1;i>=0;i--,j++)//给b[0]赋值时和a[]一样
  74. b[j]=s2[i]-'0';
  75. for(i=0;i<MAX;i++)//计算整数部分。存到a[]中
  76. {
  77. a[i]+=b[i];
  78. if(a[i]>=10)
  79. {
  80. a[i]-=10;
  81. a[i+1]+=1;
  82. }
  83. }
  84. for(i=MAX-1;i>0;i--)//输出整数部分
  85. if(a[i]!=0) break;
  86. for(;i>=0;i--)
  87. printf("%d",a[i]);
  88.  
  89. if(k_1>=k_2)//输出小数部分
  90. {
  91. for(i=k_1-1;i>=0;i--)//这里的for循环是推断小数点后是否有值,假设没有值,循环进行究竟。最后i是-1
  92. if(num_1[i]!=0) break;//假设i==-1。则不运行下边if(i!=-1),也就是不输出小数点和小数点后边的0
  93. for(j=0;j<k_1;j++)//这个for循环的作用是不输出计算得到的小数后边的0,如1.028+1.072。
  94.  
  95. for之前结果是2.100,运行完for就把 后边的0去掉,结果为2.1
  96. if(num_1[j]!=0) break;
  97. if(i!=-1)//假设小数点后边有值,输出小数点和后边的数
  98. {
  99. printf(".");
  100. for(i=k_1-1;i>=j;i--)
  101. printf("%d",num_1[i]);
  102. }
  103. }
  104. else if(k_1<k_2)//这里的if和上边一样
  105. {
  106. for(i=k_2-1;i>=0;i--)
  107. if(num_2[i]!=0) break;
  108. for(j=0;j<k_2;j++)
  109. if(num_2[j]!=0) break;
  110. if(i!=-1)
  111. {
  112. printf(".");
  113. for(i=k_2-1;i>=j;i--)
  114. printf("%d",num_2[i]);
  115. }
  116. }
  117. printf("\n");
  118.  
  119. }
  120. return 0;
  121. }
  122. /*
  123. 0 0
  124. 1.2333 1.2667
  125. 99999 1
  126. 12121213213124342545354545 13312312321312321321.02300000000000000000000000000
  127. 1.0001 1.00002
  128. 99999.889 0.111
  129. 1000.0 10000.0
  130. 112233.1 333.9
  131. 123450000 777
  132. 123400000 777.700
  133. 0.000 0.0000
  134. 1212121212.1111111 21212121.33300000000000000
  135. */



版权声明:本文博主原创文章。博客,未经同意不得转载。

HDOJ 1753 明朝A+B的更多相关文章

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

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

  2. HDOJ 1753 大明A+B

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

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

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

  4. hdoj 1753 (Java)

    刚刚开始用Java,代码难免不够简洁. import java.math.BigDecimal; import java.util.Scanner; public class Main { publi ...

  5. 【HDOJ】1753 大明A+B

    注意数据格式,可以是整数,并且注意输出最简化浮点数. #include <stdio.h> #include <string.h> #define MAXNUM 420 cha ...

  6. SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

    相信很多人进行数据存储时,会遇上如标题的异常错误. 其实也不算上一个错误. 当你的程序中有宣告一个字段的数据类型为DateTime时,但你又没有赋值给它,就进行存储时,它就会得到这样一个结果. 看看下 ...

  7. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  8. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

随机推荐

  1. 关于Core Location-ios定位

    IOS中的core location提供了定位功能,能定位装置的当前坐标,同一时候能得到装置移动信息.由于对定位装置的轮询是非常耗电的,所以最好仅仅在非常必要的前提下启动. 当中,最重要的类是CLLo ...

  2. 加入指数(IOS开发)

    该指数是用来协助查询. 原则上: - 索引的标题是不完全一样的标题显示: - 指数应该具有一定的代表性,它可表示一组数据: - 假设索引列表视图.在一般情况下不再使用扩展视图. (easy指向) 会又 ...

  3. HDU 4982 Goffi and Squary Partition(推理)

    HDU 4982 Goffi and Squary Partition 思路:直接从全然平方数往下找,然后推断是否能构造出该全然平方数,假设能够就是yes,假设都不行就是no.注意构造时候的推断,因为 ...

  4. How to Compile Java DBus

    1 download or git clone Java DBus git clone git://anongit.freedesktop.org/dbus/dbus-java dbus-java 2 ...

  5. RedGate 工具SQLMultiScript1.1

    原文:RedGate 工具SQLMultiScript1.1 RedGate 工具SQLMultiScript1.1 SQLMultiScript是一个脚本分发工具,当你写好了一个SQL脚本之后,你需 ...

  6. UML相关工具一览

    http://www.cnblogs.com/chehaoj/p/3478003.html TopCoder UML Tool 1.2.6 TopCoder, Inc http://www.topco ...

  7. 基于Cocos2dx开发卡牌游戏_松开,这三个国家

    1.它实现了动态读取地图资源.地图信息被记录excel桌格.假设你想添加地图,编者excel导入后CocoStudio数据编辑器,然后出口到Json档,到项目的Resource文件夹下. 2.SGFi ...

  8. Android:What is ART?

    背景:Android4.2之前,安卓手机系统的应用程序均在Dalvik Java的虚拟机上执行,这样的执行模式还要依靠一个编译器来实现与应用程序的沟通.应用程序每次执行时,都须要将程序内的代码转变为机 ...

  9. java战斗系列-战斗MAVENPW结构

     实战中MAVEN私服的搭建 利用maven来管理项目的构建,报告和文档已经成为了我们如今的共识,不论什么开源软件基本都在使用,当然我们如今的大部分公司也基本都在使用,我把曾经使用maven的一些经 ...

  10. 在JBuilder8中使用ANT

    在JBuilder8中使用ANT                                                            作者:翁驰原    在JBuilder8中,Ap ...