程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 浮點數加法 九度oj

浮點數加法 九度oj

編輯:C++入門知識

題目 [html] view plaincopy 題目描述:   求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     思路 這道題本來考察的應該是大整數加法,但是太多細節需要注意了,我提示幾點: 細心,分解整數部分和小數部分,分別相加,注意大整數加法的進位 注意一個測試用例,0.0+0.0應該=0.0 注意對整數部分開始0的截斷,和小數部分最後0的截斷   AC代碼 [cpp]   #include <stdio.h>   #include <string.h>   #include <stdlib.h>       #define LEN 101       int ia[LEN], fa[LEN], ib[LEN], fb[LEN], ic[LEN], fc[LEN];       int main()   {       char str1[LEN], str2[LEN];       int i, j, k, n, l1, l2, lai, laf, lbi, lbf, temp, flmax, ilmax;           while (scanf("%d", &n) != EOF) {           while (n --) {               // 初始化               memset(ia, 0, sizeof(ia));               memset(fa, 0, sizeof(fa));               memset(ib, 0, sizeof(ib));               memset(fb, 0, sizeof(fb));               memset(ic, 0, sizeof(ic));               memset(fc, 0, sizeof(fc));                   // 接收第一個浮點數               scanf("%s", str1);               l1 = strlen(str1);                   // 構建整數部分數組               for (i = 0; i < l1 && str1[i] != '.'; i ++) {                   ia[i] = str1[i] - '0';               }               lai = i;                   // 數位替換               for (j = 0, k = lai - 1; j <= lai / 2 && j < k; j ++, k --) {                   temp = ia[j];                   ia[j] = ia[k];                   ia[k] = temp;               }                   // 構建小數部分數組               for (i += 1; i < l1; i ++) {                   fa[i - 1 - lai] = str1[i] - '0';               }               laf = i - 1 - lai;                       // 接收第二個浮點數               scanf("%s", str2);               l2 = strlen(str2);                   // 構建整數部分數組               for (i = 0; i < l2 && str2[i] != '.'; i ++) {                   ib[i] = str2[i] - '0';               }               lbi = i;                   // 數位替換               for (j = 0, k = lbi - 1; j <= lbi / 2 && j < k; j ++, k --) {                   temp = ib[j];                   ib[j] = ib[k];                   ib[k] = temp;               }                   // 構建小數部分數組               for (i += 1; i < l2; i ++) {                   fb[i - 1 - lbi] = str2[i] - '0';               }               lbf = i - 1 - lbi;                   // 誰的小數位數更多               flmax = (laf >= lbf) ? laf : lbf;               int c = 0;  //小數進位               for (i = 0, j = flmax - 1; j >= 0; j --, i ++) {                   fc[i] = fa[j] + fb[j] + c;                   if (fc[i] >= 10) {                       c = fc[i] / 10;                       fc[i] %= 10;                   }else {                       c = 0;                   }               }                   // 整數相加               ilmax = (lai >= lbi) ? lai : lbi;               for (i = 0; i < ilmax; i ++) {                   ic[i] = ia[i] + ib[i] + c;                   if (ic[i] >= 10) {                       c = ic[i] / 10;                       ic[i] %= 10;                   }else {                       c = 0;                   }               }               while (c) {                   ic[ilmax ++] = c % 10;                   c /= 10;               }                       // 打印最後結果                   // 找到第一個不為0的整數位               for (j = ilmax - 1; j >= 0; j --) {                   if (ic[j] != 0) {                       break;                   }               }               if (j >= 0) {                   for (i = j; i >= 0; i --) {                       printf("%d", ic[i]);                   }               }else {                   printf("0");               }               printf(".");                   // 找到最後一個不為0的小數位               for (j = 0; j < flmax - 1; j ++) {                   if (fc[j] != 0) {                       break;                   }               }               for (i = flmax - 1; i >= j; i --) {                   printf("%d", fc[i]);               }               printf("\n");                   // 接收空行               getchar();           }           }           return 0;   }   /**************************************************************      Problem: 1137      User: wangzhengyi      Language: C      Result: Accepted      Time:290 ms      Memory:912 kb  ****************************************************************/    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved