Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于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
Author
linle
Source
Recommend
lcy
写了一个正小数相加的函数,然后测试了下,觉得正实数均可通过该函数运算得出结果!

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int midtemp[405]; 6 7 void decimals_add( char *s1, char *s2 ) 8 { 9 int num1[405], num2[405], len1, len2, i, point1, point2, temp, cnt, j; 10 //printf( "%s %s\n", s1, s2 ); 11 memset(num1,0,405*sizeof(int)); 12 memset(num2,0,405*sizeof(int)); 13 memset(midtemp,0,405*sizeof(int)); 14 len1 = strlen(s1); 15 len2 = strlen(s2); 16 //printf("%d %d\n", len1, len2); 17 //在小数的小数点后的末尾部分补0,使两小数的小数点后的长度相等 18 for( i = len1 - 1; i >= 0; i-- ) 19 if( s1[i] == '.' ) 20 break; 21 if( i == -1 ) 22 { 23 point1 = 0; 24 s1[len1] = '.'; 25 len1 += 1; 26 s1[len1] = '\0'; 27 } 28 else 29 point1 = len1 - 1 - i; 30 for( i = len2 - 1; i >= 0; i-- ) 31 if( s2[i] == '.' ) 32 break; 33 if( i == -1 ) 34 { 35 point2 =0; 36 s2[len2] = '.'; 37 len2 += 1; 38 s2[len2] = '\0'; 39 } 40 else 41 point2 = len2 - 1 - i; 42 //printf( "%d %d\n",point1, point2 ); 43 if( point1 > point2 ) 44 { 45 temp = point1 - point2; 46 cnt = len2; 47 len2 = len2 + temp; 48 while( temp-- ) 49 s2[cnt++] = '0'; 50 } 51 else if( point1 < point2 ) 52 { 53 temp = point2 - point1; 54 cnt = len1; 55 len1 = len1 + temp; 56 while( temp-- ) 57 s1[cnt++] = '0'; 58 } 59 //将小数反转,各个位转换,存储到int型的数组里 60 //printf("%d %d\n", len1, len2); 61 cnt = 0; 62 for( i = len1 - 1; i >= 0; i-- ) 63 if( s1[i] == '.' ) 64 num1[cnt++] = -1; 65 else 66 num1[cnt++] = s1[i] - '0'; 67 cnt = 0; 68 for( i = len2 - 1; i >= 0; i-- ) 69 if( s2[i] == '.' ) 70 num2[cnt++] = -1; 71 else 72 num2[cnt++] = s2[i] - '0'; 73 /*for( i = 404; i >= 0; i-- ) 74 if( num1[i] != 0 ) 75 break; 76 for( i; i >= 0; i-- ) 77 printf( "%d",num1[i] ); 78 printf( "\n" ); 79 for( i = 404; i >= 0; i-- ) 80 if( num2[i] != 0 ) 81 break; 82 for( i; i >= 0; i-- ) 83 printf( "%d",num2[i] ); 84 printf( "\n" );*/ 85 //相加 86 for( i = 0; i < 405; i++ ) 87 { 88 midtemp[i] += (num1[i] + num2[i]); 89 if( midtemp[i] >= 10 ) 90 { 91 if( num1[i+1] == -1 ) 92 midtemp[i+2]++; 93 else 94 midtemp[i+1]++; 95 midtemp[i] = midtemp[i] % 10; 96 } 97 } 98 /* for( i = 404; i >= 0; i-- ) 99 if( midtemp[i] != 0 ) 100 break; 101 for( i; i >= 0; i-- ) 102 printf( "%d",midtemp[i] ); 103 printf( "\n" ); */ 104 for( i = 404; i >= 0; i-- ) 105 if( midtemp[i] != 0 ) 106 break; 107 for( j = 0; midtemp[j] != -2; j++ ) 108 if( midtemp[j] != 0 ) 109 break; 110 if( midtemp[j] == -2 ) 111 j++; 112 //printf( "%d %d\n", i, j ); 113 for( ; i >= j; i-- ) 114 if( midtemp[i] == -2 ) 115 printf( "." ); 116 else 117 printf( "%c", midtemp[i]+'0' ); 118 printf( "\n" ); 119 } 120 121 int main(int argc, char *argv[]) 122 { 123 char a[405], b[405], i; 124 memset(a,0,405*sizeof(char)); 125 memset(b,0,405*sizeof(char)); 126 while( scanf( "%s %s", a, b ) != EOF ) 127 { 128 decimals_add( a, b ); 129 memset(a,0,405*sizeof(char)); 130 memset(b,0,405*sizeof(char)); 131 } 132 133 //system("PAUSE"); 134 return 0; 135 }