---
# System prepended metadata

title: '{C語言-87} d380. 10106 - Product'
tags: [字元/字串, C語言, 有看提示]

---

# [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)