2011-06-21 10:08:47Morris

d451. 科學記號

http://zerojudge.tw/ShowProblem?problemid=d451

內容 :

科學上採用的數字常寫成 a × 10n 的形式﹐其中 1 ≤ a < 10n 是整數﹐
例如:() 光速是每秒 300,000,000 公尺﹐若取一位有效數字,

記為 3 × 108 公尺/秒。

() 電子的質量是0.000,000,000,000,000,000,000,000,000,909 公克,
若取二位有效數字,記為 9.1 × 10-28 公克。

輸入說明 :

輸入檔中有多筆測試資料。每筆測試資料第一行有一個正整數 N, 1 N 100),代表有N筆測試資料。

接下來,有N行,每行有二個數字,第二數字表示取幾位有效數字。

須四捨五入!

輸出說明 :

對於每筆測資,輸出一行此筆資料的科學記號

範例輸入 :

2
300,000,000 4
0.000,000,000,000,000,000,000,000,000,909 2

範例輸出 :

3.000x10(8)
9.1x10(-28)

提示 :

出處 :

板橋高中98資訊能力競賽 (管理:snail)



作法 : 模擬
小心 9999999999 3 這種測資

/*********************************************************************************/
/*  Problem: d451 "科學記號" from 板橋高中98資訊能力競賽            */
/*  Language: C                                                                   */
/*  Result: AC (2ms, 282KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-20 13:21:21                                     */
/**********************************************************************************/


#include<stdio.h>
main() {
    int T, d, a, b;
    char s[102];
    scanf("%d", &T);
    while(T--) {
        scanf("%s %d", s, &d);
        int pointset = -1, numflag = 0, numset = 0;
        int S[102] = {}, L = 0;
        for(a = 0; s[a]; a++) {
            if(s[a] >= '0' && s[a] <= '9') {
                S[L] = s[a] - '0';
                if(numflag == 0 && s[a] != '0')
                    numset = L, numflag = 1;
                L++;
            }
            if(s[a] == '.')
                pointset = L-1;
        }if(pointset == -1) pointset = L-1;
        
        if(numset+d <= L) {/*不補0*/
            int index = numset+d-1;           
            if(S[numset+d] >= 5) {
                S[index]++;
                while(S[index] >= 10 && index >= 1) {
                    if(index - 1 >= 0) {
                        S[index-1] += S[index]/10, S[index] %= 10;
                    }
                    index--;
                }
            }
            if(S[index] >= 10) {
                printf("1");
            }
            else {
                printf("%d", S[numset]);
            }
            if(d > 1) printf(".");
           
            for(a = numset+1; a < numset+d; a++)
                printf("%d", S[a]);
            printf("x10(%d)", (pointset-numset)+(S[index] >= 10));
               
        }
        else {/*補0*/
            printf("%d", S[numset]);
            if(d > 1) printf(".");
            for(a = numset+1; a < numset+d; a++)
                printf("%d", S[a]);
            printf("x10(%d)", (pointset-numset));
        }
        puts("");
    }
    return 0;
}