(参考文献から)0 0 1 0 + 0 1 1 0 ------------ 1 0 0 0
00101
* 00011
----------
00101
00101
00000
00000
----------
00001111
コンピュータはこのような計算を1秒間に数億回やってしまいます。5: 1 0 1 4: 1 0 0 1: 0 0 1 ------------- 0 0 0
5: 1 0 1 4: 1 0 0 2: 0 1 0 -------------- 0 1 0
5: 1 0 1 4: 1 0 0 6: 1 1 0 -------------- 1 1 0
5: 0 1 0 4: 1 0 0 6: 1 1 0 --------------- 0 0 0
/***********************************************************
nim.c -- 三山くずし
***********************************************************/
#include <stdio.h>
#include <stdlib.h>
//奥村著:アルゴリズム辞典より
int main()
{
int a[4], i, j, imax, max, n, r, x, my_turn;
for (i = 1; i <= 3; i++) {//繰り返し処理
printf("%d 番の山の石の数? ", i); scanf("%d", &a[i]);
if (a[i] <= 0) return EXIT_FAILURE;
}
for (my_turn = 1; ; my_turn ^= 1) {
max = 0;
for (i = 1; i <= 3; i++) {
printf(" %d ", i);//表示
for (j = 1; j <= a[i]; j++) printf("*");
printf("\n");
if (a[i] > max) {//大小比較
max = a[i]; imax = i;
}
}
if (max == 0) break;
if (my_turn) {
printf("私の番です.\n");
x = a[1] ^ a[2] ^ a[3]; /* 偶奇性演算和 */
j = 0;
for (i = 1; i <= 3; i++)
if (a[i] > (a[i] ^ x)) j = i;
if (j != 0) a[j] ^= x; else a[imax]--;
} else {//あなたの番です
do {
printf("何番の山からとりますか? ");
r = scanf("%d", &i); scanf("%*[^\n]");//読み取り
} while (r != 1 || i < 1 || i > 3 || a[i] == 0);
do {
printf("何個とりますか? ");
r = scanf("%d", &n); scanf("%*[^\n]");
} while (r != 1 || n <= 0 || n > a[i]);
a[i] -= n;
}
}
if (my_turn) printf("あなたの勝ちです!\n");
else printf("私の勝ちです!\n");
return EXIT_SUCCESS;
}
C言語は情報理工学部の標準(必修)言語です。1番の山の石の数?:4 2番の山の石の数?:3 3番の山の石の数?:2 0 :**** 1 :*** 2 :** ....... 何番の山からとりますか?:1 何個とりますか? :1 0 : 1 : 2 :* now I play I win

