数学パズル問3
「プログラマ脳を鍛える数学パズル」の問3をC言語で実装。
今回は実装的にはなんら問題なく、算出された答えに意味があるのだろう。
問3:1〜100の番号が書かれた100枚のカードが裏返しで並べられている。
n番目のカードからn-1枚おきにカードを裏返し、どのカードの向きも変わらなくなるまで
続けたとき、裏向きになっているカードの番号を全て求めよ。
解: 1, 4,9,16,25,36,49,64,81,100
(1〜10の平方数)
#include <stdio.h> #define FRONT 1 #define BACK 0 int main(void){ int array[101] = {BACK}; int card_status; /*2番目のカードから始めるので、i = 2*/ for(int i = 2; i <= 100; i++){ /*配列の番号をカードの番号とするので、j = 1*/ for(int j = 1;j <= 100; j++){ /*100番目のカードを越えたら次のターンへ*/ if(i * j <= 100){ /*カードの向きを表裏逆にする*/ card_status = array[i * j]; if(card_status == FRONT){ array[i * j] = BACK; } else { array[i * j] = FRONT; } } else { break; } } } for(int i = 1; i <= 100; i++){ if(array[i] == BACK){ printf("result : %d\n", i); } } return 0; }