C语言 开关灯实验

实验说明
有 n 盏灯,编号 1~n。第 1 个人把所有灯打开,第 2 个人按下所有编号为 2 的倍数的开关,第 3 个人按下所有编号为 3 的倍数的开关,依次类推。按开关时其中关掉的灯将被打开,开着的灯将被关闭。一共有 k 个人,输出最后开着的灯的编号。n 和 k 在运行时输入,1≤k≤n≤1000。输出的时候每行输出 10 个序号且利用输出格式实现左对齐。
代码实现

  • 用 0 表示灯关着,1 表示灯开着。先定义一个数组,全部赋值为 0。
  • 用取余的方式判断第m个人是否要对第n个灯进行操作。
  • 摁过开关后 0 变成 1,1 变成 0。最后输出所有为 1 的元素。
/*n人开关灯实验*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
    
    
    int arr[1000],lnum,pnum,count=0;

    printf("输入灯的数目:");
    scanf("%d",&lnum);
    for(int i=0;i<lnum;i++)   //赋初值
        arr[i]=0;
    printf("输入人的个数:");
    scanf("%d",&pnum);
    
    for(int m=1;m<=pnum;m++) //依次开关灯;
    {
    
    
        for(int n=1;n<=lnum;n++)
        {
    
    
            if(n%m==0)
            {
    
    
                if(arr[n-1]) arr[n-1]=0;
                else arr[n-1]=1;
            }
        }
    }

    for(int i=0;i<lnum;i++)  //输出开着的灯的编号
    {
    
    
        if (arr[i]!=0)
        {
    
    
            printf("%-4d",i+1);
            count++;
            if (count%10==0) printf("\n");
        }
    }

    return 0;
}

实验结果
输入灯的数目:200
输入人的个数:10
1 4 9 11 12 13 14 15 17 18
19 20 21 23 27 29 31 35 37 41
42 43 44 47 52 53 54 56 59 60
61 67 68 70 71 72 73 75 76 79
81 83 89 90 92 97 98 99 100 101
103 107 109 112 113 116 117 121 124 127
131 132 137 139 143 144 147 148 149 151
153 154 156 157 162 163 164 165 167 168
169 171 172 173 175 179 181 182 187 188
191 193 195 197 198 199

猜你喜欢

转载自blog.csdn.net/weixin_42145554/article/details/128159118