2011-06-21 10:08:47Morris
d451. 科學記號
http://zerojudge.tw/ShowProblem?problemid=d451
若取二位有效數字,記為 9.1 × 10-28 公克。
作法 : 模擬
小心 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;
}
內容 :
科學上採用的數字常寫成 a × 10n 的形式﹐其中 1 ≤ a < 10﹐n 是整數﹐
例如:(一) 光速是每秒 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;
}