古典的な電球問題を C 言語で解く

トピック: 1、2、3、...、n-1、n と番号が付けられた n 個のライトがあり、最初の人はすべてのライトをオンにし、2 番目の人は 2 の倍数の番号が付けられたすべてのスイッチを押します (これらのライトは3 番目の人が 3 の倍数の番号が付いたすべてのスイッチを押します (オフになっているライトはオンになり、オンになっているライトはオフになります)。合計 k 人がいて、最後にどのライトが点灯していますか? n と k (1≦k≦n≦1000) を入力し、点灯しているライトの数を出力します。

ここに画像の説明を挿入

アルゴリズム: 列挙

ライトが初めてオンになると、すべての電球が 1 に設定されます。つまり、点灯しています。k 回オンとオフを切り替えた後、各ライトを順番に k 回トラバースするだけで済みます。各トラバース中に、ライトの数がスイッチの序数で割り切れる場合、ライトの状態は 1 回切り替えられます。すべての走査の後、出力値はまだ 1 は点灯している電球の数です. 電球の数を数えたい場合は、count 変数を count に設定できます.

#include<stdio.h>
#define N 1000

int exchange(int a[],int k) {
    
    
 if(a[k] == 0) {
    
    
  return 1;
 }
 else {
    
    
  return 0;
 }
}

int main() {
    
    
    int i,j,n,k;
    printf("请输入开关次数k:");
    scanf("%d",&k);
    int a[N];

    for(i = 1; i <= N; i++) {
    
    
        a[i] = 0;
    }

    if(k >= 1) {
    
    
        for(i = 1; i <= N; i++) 
        {
    
    
            a[i] = 1;
        }
    }

    for(i = 1 ;i <= N; i++) {
    
     
        for(j = 2; j <= k; j++){
    
    
            if(i % j==0) 
   a[i] = exchange(a,i);
        }
    }

    
    for(i=1;i<=N;i++) {
    
    
        if(a[i]==1)
        {
    
    
            printf("%d\t",i);
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/chenjh027/article/details/128102651