# [C語言] d380. 10106 - Product
> 作者: Aria
> 2024/09/08
## 觀念:
1. atoi(array)和 array[i]-'0'的差別 <font color="ff0000">(待補充)</font>
2. char array[100] 和 int array[100] 不同,尤其是要計算的話,不能用char
3. memset並非僅適用於char, 而是使用char以外的型別時,要特別小心。
- 從程式碼最佳化角度看:盡量不要用memset來做初始化,因為可能因編譯器差異而產生問題。(例如:使用Misra代碼審查時也盡量不用memset.)
4. 要在int型別的array上使用memset, 可以用以下方法代替:
```c=
int array[100];
for(i=0;i<100;i++)
{
array[i]=k; //k為定值
}
```
補充:[memset](https://hackmd.io/@number10101/rJtWR6dyJg)
5. pow(10,k); 的回傳值是double型別,所以在printf中要用%f<font color="ff0000">(待補充)</font>
6.
```c=
if(c || d){}
```
檢查 c 或 d 是否為"非零"。只要 c 或 d 中至少有一個為TRUE(非零),條件就為TRUE。
例如:
c為$1$,而d為$0$ ⇒TRUE。
```C=
if(c || d){}
```
代表:
```C=
if(c==1 || d==1){}
```
## AC程式碼:
(是在[[2](https://ithelp.ithome.com.tw/articles/10219842)]的基礎上魔改的)
```C=
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int main(){
char X[300],Y[300];
int x[300]={0};
int y[300]={0};
int i=0;
int j=0;
int s[1000]={0};
memset(X,'0',300);
memset(Y,'0',300);
while(scanf("%s",X)!=EOF){
scanf("%s",Y);
int len1 = strlen(X);
int len2 = strlen(Y);
for(i=0;i<=len1-1;i++){
x[i]=X[len1-i-1]-'0';
}
for(i=0;i<=len2-1;i++){
y[i]=Y[len2-i-1]-'0';
}
for(i=0;i<len1;i++){
for(j=0;j<len2;j++){
//s[t]代表x[]*y[]
int a = x[i]*y[j];
//觀察到第3位和第4位相乘會在第6位
//2個0乘3個0=5個0
//2+3=5
//200*4000=800000
s[i+j] = s[i+j] + a;
//考量進位
s[i+j+1] = s[i+j+1] + (s[i+j]/10);
s[i+j] = s[i+j] %10;
}
}
int key=len1+len2;
bool k=0;
for(i=key;i>=0;i--){
if(s[i]!=0){
k=1;
}
if(k==1){
printf("%d",s[i]);
}
}
printf("\n");
}
return 0;
}
```
## 心得:
這題主要key point在於乘法位數的觀察。一開始將 $123 * 6$ 寫成了 $100 * 6 + 20 * 6 + 3 * 6$, 但 $123$ 若變成了 $1230000000$ 則會在一開始就面臨溢位。
所以重要的是要記住在哪個位置相乘,相乘後會在哪個位置,就可以了。
## Reference:
[1] [d380. 10106 - Product](https://zerojudge.tw/ShowProblem?problemid=d380)
[2] [hanktina2. 一日一CPE系列 第 8 篇 [Day8]10106: Product](https://ithelp.ithome.com.tw/articles/10219842)