###### 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;
}
```