###### tags: `計概詳解` # 幾 A 幾 B (Public) 輸入兩個 4 位整數,求出相同位置且數字相同的個數 (A),以及不同位置且數字相同的個數 (B),例如 1234 及 1253 為 2 A 1 B。輸入的部份會有多行,以檔尾結束,輸出的部份對應到輸入,如以下範例所示。 ## 解題思維 ### 練習寫一個函數來獲得幾A幾B: <code>void getAB(int guess, int answer, int *A, int *B);</code> guess是使用者猜的數字。answe是答案。A、B分別表示幾A幾B。 ```c void getAB(int guess, int answer, int *A, int *B) { *A = countA(guess, answer); *B = countB(guess, answer); } ``` ### 計算幾個A 此函數用來計算幾個A: <code>int countA(int guess, int ans);</code> 1. 參數guess是使用者猜的數字,ans是答案。 2. 使用%10分別取得guess及ans的個位數,比較兩數,若相等,則cnt++。 3. 比較完之後將guess及ans分別除以10,將其個位去掉,再重複同樣的運算。 4. 因為guess及ans是四位數,所以用for迴圈執行4次比較。 5. 最後輸出cnt即可知道猜㆗幾個A。 ```c int countA(int guess, int ans) { int d1, d2, cnt=0; for (int i=0; i<4; i++){ d1 = guess%10; d2 = ans%10; if (d1 == d2) cnt++; guess/=10; ans/=10; } return cnt; } ``` ### 計算幾個B <code>int countB(int guess, int ans);</code> 此函數用來計算幾個B: 1. 將guess及ans的個位、十位、百位及千位數分別存入陣列a及陣列b。 2. 使用雙重for迴圈掃描所有陣列a和陣列b的配對比較。 3. 若位置不同<code>(i != j)</code>且數字相同<code>(a[i]== b[j])</code>,則cnt++。 4. 最後輸出cnt即可知道猜中幾個B。 ```c int countB(int guess, int ans) { int a[4], b[4], cnt=0; for (int i=0; i<4; i++){ a[i] = guess%10; b[i] = ans%10; guess/=10; ans/=10; } for (int i=0; i<4; i++){ for (int j=0; j<4; j++){ if (i!=j && a[i]==b[j]) cnt++; } } return cnt; } ``` ### 主程式 本題需要重複讀取測資,直到檔尾。 ```c int main() { int guess, answer, A, B; while(scanf("%d%d", &answer, &guess) != EOF){ getAB(guess, answer, &A, &B); printf("%d A %d B\n", A, B); } return 0; } ``` ### 程式碼 ```c= #include <stdio.h> void getAB(int guess, int answer, int *A, int *B); int countA(int guess, int ans); int countB(int guess, int ans); int main() { int guess, answer, A, B; while(scanf("%d%d", &answer, &guess) != EOF){ getAB(guess, answer, &A, &B); printf("%d A %d B\n", A, B); } return 0; } void getAB(int guess, int answer, int *A, int *B) { *A = countA(guess, answer); *B = countB(guess, answer); } int countA(int guess, int ans) { int d1, d2, cnt=0; for (int i=0; i<4; i++){ d1 = guess%10; d2 = ans%10; if (d1 == d2) cnt++; guess/=10; ans/=10; } return cnt; } int countB(int guess, int ans) { int a[4], b[4], cnt=0; for (int i=0; i<4; i++){ a[i] = guess%10; b[i] = ans%10; guess/=10; ans/=10; } for (int i=0; i<4; i++){ for (int j=0; j<4; j++){ if (i!=j && a[i]==b[j]) cnt++; } } return cnt; } ```