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