九度oj 题目1137:浮点数加法
- 题目描述:
-
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
- 输入:
-
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
- 输出:
-
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
- 样例输入:
-
2 0.111111111111111111111111111111 0.111111111111111111111111111111 10000000.655555555555555555555555555555 1.444444444444444444444444444445
- 样例输出:
-
0.222222222222222222222222222222 10000002.1
这道题自我感觉做的麻烦了,主要是对阶1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 6 #define MAX 102 7 8 char A[MAX]; 9 char B[MAX]; 10 int AZ[MAX]; 11 int BZ[MAX]; 12 int AX[MAX]; 13 int BX[MAX]; 14 15 int calSump(int a[], int b[], int n) { 16 int ci = 0; 17 for(int i = 0; i < n; i++) { 18 int temp = a[i] + b[i] + ci; 19 int ben = temp % 10; 20 ci = temp/10; 21 a[i] = ben; 22 } 23 return ci; 24 } 25 26 void calSumz(int a[], int b[], int n, int ci) { 27 for(int i = 0; i < n; i++) { 28 int temp = a[i] + b[i] + ci; 29 int ben = temp % 10; 30 ci = temp/10; 31 a[i] = ben; 32 } 33 a[n] = ci; 34 } 35 36 int max(int a, int b) { 37 return a>b?a:b; 38 } 39 40 int main(int argc, char const *argv[]) 41 { 42 int n; 43 //freopen("input.txt","r",stdin); 44 scanf("%d",&n); 45 while(n--) { 46 scanf("%s",A); 47 scanf("%s",B); 48 int azw = 0, axw = 0; 49 int bzw = 0, bxw = 0; 50 for(int i = 0; i < strlen(A); i++) { 51 if(A[i] != '.') { 52 azw++; 53 } 54 else { 55 break; 56 } 57 } 58 //11.12 5 - 2 - 1 = 2 59 axw = strlen(A) - azw - 1; 60 61 for(int i = 0; i < strlen(B); i++) { 62 if(B[i] != '.') { 63 bzw++; 64 } 65 else { 66 break; 67 } 68 } 69 //11.12 5 - 2 - 1 = 2 70 bxw = strlen(B) - bzw - 1; 71 72 memset(AZ, 0, sizeof(AZ)); 73 memset(AX, 0, sizeof(AX)); 74 memset(BZ, 0, sizeof(BZ)); 75 memset(BZ, 0, sizeof(BZ)); 76 77 for(int i = azw - 1,j = 0; i >= 0, j < azw; i--,j++) { 78 AZ[j] = A[i] - '0'; 79 } 80 for(int i = bzw - 1,j = 0; i >= 0, j < bzw; i--,j++) { 81 BZ[j] = B[i] - '0'; 82 } 83 //0.123 84 //0.123456789 85 int maxz = max(azw, bzw); 86 int maxp = max(axw, bxw); 87 if(axw < bxw) { 88 int j = 0; 89 for(j = 0; j < (bxw - axw); j++) { 90 AX[j] = 0; 91 } 92 for(int i = strlen(A) - 1;j < bxw,i > azw;j++, i--) { 93 AX[j] = A[i] - '0'; 94 } 95 for(int i = strlen(B) - 1, k = 0; i >= 0, k < strlen(B); i--,k++) { 96 BX[k] = B[i] - '0'; 97 } 98 } 99 else { 100 int j = 0; 101 for(j = 0; j < (axw - bxw); j++) { 102 BX[j] = 0; 103 } 104 for(int i = strlen(B) - 1;j < axw,i > bzw;j++, i-- ) { 105 BX[j] = B[i] - '0'; 106 } 107 for(int i = strlen(A) - 1, k = 0; i >= 0, k < strlen(A); i--,k++) { 108 AX[k] = A[i] - '0'; 109 } 110 } 111 112 113 int pci = calSump(AX, BX, maxp); 114 115 calSumz(AZ,BZ, maxz, pci); 116 117 bool isAll0 = true; 118 for(int i = maxz + 1; i >= 0; i--) { 119 if(isAll0 && AZ[i] != 0) { 120 isAll0 = false; 121 } 122 if(!isAll0) { 123 printf("%d", AZ[i]); 124 } 125 } 126 if(isAll0) { 127 printf("%d",0); 128 } 129 printf("."); 130 131 int last = maxp-1; 132 for(int i = 0; i < maxp; i++) { 133 if(AX[i] != 0) { 134 last = i; 135 break; 136 } 137 } 138 for(int i = maxp-1; i >= last; i--) { 139 printf("%d", AX[i]); 140 } 141 printf("\n"); 142 } 143 return 0; 144 }