Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a248. 新手訓練 ~ 陣列應用

題目連結

https://zerojudge.tw/ShowProblem?problemid=a248

建議類題

a240. 1/17小數第 n 位

解題思路

根據題意,本題希望我們將輸入進行除法運算後,輸出商數到小數點後第10000位。由於10000位明顯超出任何資料型態的變數的儲存範圍,因此我們可以換個想法,改用陣列將每一位數依序存入,最後只要輸出陣列即可。具體的做法是模擬直式除法,將運算過程拆成一位一位來看,每次都先將現在的數字乘上10倍作被除數,取商數後將其存進陣列中,再將餘令為新的被除數,直到存滿10000位為止。

舉1除以17為例,我們先將1乘以10變10,10除以17得0,因此1除以17的小數點後第一位即為0。接者我們再將10乘以10變100作新的被除數,100除以17得5,即為1除以17的小數點後第二位。接著我們將100減去17乘5後得15,再乘以10就會是新的被除數150,以此類推。

注意事項

根據題意,測資檔會包含多組測資,因此需使用「EOF寫法」。所謂 EOF 並不是一種真實存在的字元,而是「End Of File」的縮寫,意思是一份檔案的結尾,也可以說是輸入的停止。通常程式在執行時會先讀取輸入,再依據輸入進行相對的行動,但我們未必能知道輸入有幾筆、到什麼時候結束,這時候我們就可以讓電腦自動偵測。一旦它偵測到EOF條件為True,即代表輸入停止,就會結束讀取輸入,如此我們的程式就不用事先指定輸入的筆數,可以不斷讀取輸入並執行直到輸入結束。

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main() {
int a, b, N;
while(scanf("%d%d%d", &a, &b, &N)!=EOF) {
printf("%d.", a/b);
a%=b;

int ans[N];
for(int i=0;i<N;i++) {
a*=10;
ans[i]=a/b;
a-=ans[i]*b;
printf("%d", ans[i]);
}
printf("\n");

}
return 0;
}