トピック: 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;
}