計算機の学習メモ

この想像しがたい状況が成立する過程を、以下に詳述する。

数学パズル問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;
}