Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a149. 乘乘樂

題目連結

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

解題思路

本題希望我們求得輸入整數的各個位數乘積。因此,我們可以將問題分成兩個部分:將輸入數字的各個位數分開,以及把它們乘起來。

首先,為了將輸入數字各個位數分開存放,我們可以使用字串讀取輸入,將各個位數視作獨立的字元存放在字元陣列中。可能會有人好奇,為什麼我們不使用整數陣列存放各個位數呢?這是因為整數陣列讀取時會以空白作為各項的分界,各數字間必須要有空格才會被判定為不同項,而字元陣列則是自動將各個字元單獨存進陣列中。舉例來說,若是輸入的數字為356,因為3、5和6之間沒有以空白隔開,使用整數型態陣列讀取的話只會讀到356一個數字;而字元陣列是將356視為長度為3的字串,因此會將3、5、6分別以字元型態分開存放。

再來,在運算時我們必須將其從字元型態轉回整數型態。至於如何轉換,可以參考我們之前在a009. 解碼器所說的,使用ASCII碼。透過查表可知,0的ASCII碼為48,因此阿拉伯數字的真實值即為其ASCII碼減去48。

注意事項

本題中使用了strlen()函式取出字串長度。由於strlen()函式並非標準函式庫裡的函式,使用前須先引用 <string.h> 函式庫。

程式碼:C語言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <string.h>
int main() {
//宣告並讀取變數T,代表測資筆數
int T;
scanf("%d", &T);
//用for迴圈讀取T次輸入的數字
for(int i = 0 ; i < T ; i++) {
//以字串的方式讀取,將輸入數字的各個位數轉成字元型態存放在字元陣列中
char num[11];
scanf("%s", num);
//宣告變數product,賦值為1,代表輸入數字各個位數的乘積
//宣告變數test,賦值為0,代表尚未偵測到此數字有位數為0
int product = 1, test = 0;
for(int i = 0 ; i < strlen(num) ; i++) {
//若此位數不為0,就將其與前面的乘積相乘
if(num[i] != 0)
product *= num[i]-48;
//若此數字任一位數為0,其各位數乘積必為0,將test設為1後即可跳出迴圈
else {
test++;
break;
}
}
//若test為0,代表此數字沒有位數為0,輸出其乘積
if(test == 0)
printf("%d\n", product);
//若test為1,代表此數字有位數為0,其乘積必為0
else
printf("0\n");
}
return 0;
}