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