全知全能を目指す人のありがたい雑記

何かしら意味のあるありがた~い話か、意味のない雑念だらけの日記を書く予定です。

電球がONである数を数えるプログラム

問題

1からnまでの数字が振られたn個の電球がある。これらの電球に対して、次の操作を順に行う。

・1の倍数の電球のON/OFFを切り替える。
・2の倍数の電球のON/OFFを切り替える。
・mの倍数の電球のON/OFFを切り替える。

このとき、最終的にONになっている電球の数を出力するプログラム作成せよ。最初は全ての電球がOFFになっているものとする。

入力例 出力例
12 3 電球ONの数:6
25 9 電球ONの数:14
500 162 電球ONの数:256
1000 1000 電球ONの数:31

コード

#include <stdio.h>
#include <stdlib.h>

//電球をnの倍数で切り替える処理
void switchBulbs(int *bulbs, int multiple, int count){
    for(int num = multiple-1; num < count; num += multiple){
        if(bulbs[num] == 0){
            bulbs[num] = 1;
        }else{
            bulbs[num] = 0;
        }
    }
}

int main(void){
    int n,m;
    scanf("%d%d",&n,&m);
    
    int *bulbs = (int*)malloc(n * sizeof(int));
    for(int num = 0; num < n; ++num){
        bulbs[num] = 0;    
    }
    
    for(int num = 1; num < m + 1 ; ++num){
        switchBulbs(bulbs, num, n);
    }
    
    int sum = 0;
    for(int num = 0; num < n; ++num){
        if(bulbs[num] == 1){
           ++sum; 
        }    
    }
    free(bulbs);
    
    printf("電球ONの数:%d",sum);
}

入力

1000 1000

出力

電球ONの数:31

ただ、もっとスマートなコードがあったので
あまり宛てにしないでください。。。orz