1. ```c
  2. #include<stdio.h>
  3. #include<string.h>
  4. //代码比较长,其实很好理解,愿意了解的可以看看
  5. int main()
  6. {
  7. char s1[205],s2[205];//起始字符串
  8. //定义整数部分a1,b1,小数部分a2,b2; 结果 整数部分c1, 小数部分c2
  9. static int a1[101],a2[101],b1[101],b2[101],c1[505],c2[505];
  10. int i,flag = 1,top_a1,top_a2,top_b1,top_b2,len_c1,len_c2;
  11. //定义小数位的进位变量jinshu,整数位的进位变量chushu
  12. int jinshu ,chushu;
  13. # ### //为变量赋初值
  14. top_a1 = top_a2 = top_b1 = top_b2 = 0;
  15. len_c1 = len_c2 = 0;
  16. jinshu = chushu = 0;
  17. scanf("%s",s1);
  18. getchar();
  19. scanf("%s",s2);
  20. //当遇到小数点时改变flag,存入另一数组
  21. for( i=0; i<strlen(s1); i++){
  22. if(s1[i] == '.'){
  23. flag = 0;
  24. continue;
  25. }
  26. if(flag) a1[top_a1++] = (s1[i]-'0');
  27. else a2[top_a2++] = (s1[i]-'0');
  28. }
  29. int len_a1 = top_a1-1;
  30. int len_a2 = top_a2-1;
  31. flag = 1;
  32. for( i=0; i<strlen(s2); i++){
  33. if(s2[i] == '.'){
  34. flag = 0;
  35. continue;
  36. }
  37. if(flag) b1[top_b1++] = (s2[i]-'0');
  38. else b2[top_b2++] = (s2[i]-'0');
  39. }
  40. int len_b1 = top_b1-1;
  41. int len_b2 = top_b2-1;
  42. //-------------------------------------------------
  43. //将小数部分结果写在c2中
  44. //加len_a2>=0,防止因为前面的-1操作出现bug;
  45. while(len_a2>=0&&len_a2>len_b2){
  46. c2[len_c2++] = a2[len_a2];
  47. len_a2 --;
  48. }
  49. while(len_b2>=0&&len_a2<len_b2){
  50. c2[len_c2++] = b2[len_b2];
  51. len_b2 --;
  52. }
  53. while(len_a2>=0&&len_a2==len_b2){
  54. c2[len_c2] = a2[len_a2]+b2[len_b2]+jinshu ;
  55. jinshu = c2[len_c2]/10;
  56. c2[len_c2] = c2[len_c2]%10;
  57. len_c2 ++;
  58. len_a2 --;
  59. len_b2 --;
  60. }
  61. len_c2 --;
  62. //-----------------------------------------------------
  63. chushu += jinshu;//将小数位的进位加到整数位
  64. while(len_a1>=0&&len_b1>=0){
  65. c1[len_c1] = a1[len_a1]+b1[len_b1]+chushu;
  66. chushu = c1[len_c1]/10;
  67. c1[len_c1] = c1[len_c1]%10;
  68. len_c1 ++;
  69. len_a1 --;
  70. len_b1 --;
  71. }
  72. while(len_a1>=0){
  73. c1[len_c1] = a1[len_a1]+chushu;
  74. chushu = c1[len_c1]/10;
  75. c1[len_c1] = c1[len_c1]%10;
  76. len_c1 ++;
  77. len_a1 --;
  78. }
  79. while(len_b1>=0){
  80. c1[len_c1] = b1[len_b1]+chushu;
  81. chushu = c1[len_c1]/10;
  82. c1[len_c1] = c1[len_c1]%10;
  83. len_c1 ++;
  84. len_b1 --;
  85. }
  86. while(chushu){//处理整数位最高位进位
  87. c1[len_c1] = chushu%10;
  88. chushu /= 10;
  89. len_c1++;
  90. }
  91. len_c1 --;
  92. for( i=len_c1; i>=0; i--){
  93. printf("%d",c1[i]);
  94. }
  95. //若均为整数,则len_c2会为-1(前面有个-1操作),以此判断是否有小数
  96. if(len_c2>=0) printf(".");
  97. for( i=len_c2; i>=0; i--){
  98. printf("%d",c2[i]);
  99. }
  100. printf("\n");
  101. return 0;
  102. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论