胚芽鞘 发表于 2022-10-5 16:56:39

【C】开关灯的数学问题

题目如下
代码如下,不知道问题出在哪了,运行时没有输出
#include<stdio.h>

int main()
{
    int m, n, M, N, power = 1; //M,N 为输入的值,m,n为计数灯和人的变量,power表示暗亮
    printf("输入\n");
    scanf("%d %d", M, N);
    for(n = 1;n < N;n++)
    {
      for(m = 1;m < M;m++)
      {
            if(n % m == 0 )
            {
                power = -power;
            }
      }
    if (power == -1)
    {
      printf("%d,", n);
    }
    }

    return 0;
}

顶级太阳 发表于 2022-10-5 16:56:40

本帖最后由 顶级太阳 于 2022-10-6 10:10 编辑

仔细看了你的代码,我觉得你的代码,核心是没有那么多的灯,从始至终,对一盏灯power开关了m*n次。

我的思路是:这个题目给出灯的数量不大于5000,要挨个校验,那么考察的应该是数组,将灯的数量作为数组,而灯的亮灭作为数组元素的值。所有人员挨个操作,那么就应该是利用计算机运行速度快的特性,每一个人,将所有灯遍历一遍,也就是作为循环元素处理。最终的结果输出,就是再次遍历数组,将符合结果要求的数组编号输出出来。
以下是我运行验证过的代码(只是测试了能够正常运行,未查看结果是否正确)
#include<stdio.h>
int main()
{
        int a={1};      //初始化,灯开初始化为1.   灯灭为-1
        int m,n;            //n为人数,m为灯数量
        int i,j;                //临时变量

        printf("输入正整数N和M,以单个空格隔开。\n");
        scanf("%d %d",&n,&m);

        for(i=0;i<m;i++)   //第一个人关闭所有灯,共m盏
        {
                a=-1;
        }

        for(i=0;i<m;i++)      //第二个人将编号为2倍数的灯打开
        {
                if((i+1)%2==0)a=1;      //采用i+1是由于数组从0开始,灯的数量计数从1开始
        }
       
        for(j=0;j<n-2;j++)   //第三个人开始,将自己编号倍数的等做相反处理
        {
                for(i=0;i<m;i++)
                {
                        if((i+1)%(j+1)==0)a=-a;   //采用j+1是由于数组从0开始,灯的数量从1开始
                }

        }       
//以上题目要求动作已经完成,下面遍历输出

        printf("以下为运行结果:\n");
        for(i=0;i<m;i++)
        {
                if(a==-1)printf("%d ",i+1);            //这里用i+1也是基于数组和实际数量的差1
        }
        printf("\n");          //最终输出一个回车,作为题目完成。


        return 0;
}


tommyyu 发表于 2022-10-5 17:15:16

本帖最后由 tommyyu 于 2022-10-5 19:18 编辑

你每轮循环后都得把power变为初始值1,因为在循环过程中power的值会发生变化(变成1或-1),但我们每一轮循环之前都想让power的值是1
#include<stdio.h>

int main()
{
    int m, n, M, N, power = 1; //M,N 为输入的值,m,n为计数灯和人的变量,power表示暗亮
    printf("输入\n");
    scanf("%d %d", M, N);
    for(n = 1;n < N;n++)
    {
      for(m = 1;m < M;m++)
      {
            if(n % m == 0 )
            {
                power = -power;
            }
      }
    if (power == -1)
    {
      printf("%d,", n);
    }
    }

    return 0;
}

jackz007 发表于 2022-10-5 18:07:09

本帖最后由 jackz007 于 2022-10-6 10:39 编辑

#include <stdio.h>

int main(void)
{
      int d = {0} , i , j , k , m , n                               ;
      scanf("%d%d" , & n , & m)                                           ;
      for(i = 1 ; i < n ; i += 2) d = 1                              ;
      for(i = 2 ; i < n ; i ++) for(j = i ; j < n ; j += i + 1) d ^= 1 ;
      for(i = 0 ; d ; i ++)                                          ;
      printf("%d" , i + 1)                                                ;
      for(i ++ ; i < n ; i ++) if(! d) printf(",%d" , i + 1)         ;
      printf("\n")                                                      ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
10 10
1,4,9

D:\\C>x
500 500
1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484

D:\\C>

jhq999 发表于 2022-10-5 18:43:54

本帖最后由 jhq999 于 2022-10-5 18:58 编辑

int main(){

      int n,m,i,j;
      scanf("%d%d",&n,&m);
      int l;
      for(i=1;i<=n;i+=1)
      {
            if(i%2)l=1;
            else l=0;
      }
      for(i=3;i<=m;i+=1)
      {
            for(j=1;j*i<=n;j+=1)
            {
                l=!l;
            }
      }
      for(i=1;i<=n;i+=1)if(l)printf("%4d",i);

      return 0;
}

5000 5000
   1   4   9    16    25    36    49    64    81   100   121   144   169   196   225   256   289   324   361   400   441   484   529   576   625   676   729   784   841   900   961102410891156122512961369144415211600168117641849193620252116220923042401250026012704280929163025313632493364348136003721384439694096422543564489462447614900
Process returned 0 (0x0)   execution time : 6.460 s
Press any key to continue.

顶级太阳 发表于 2022-10-7 12:32:21

本帖最后由 顶级太阳 于 2022-10-7 12:33 编辑

            
页: [1]
查看完整版本: 【C】开关灯的数学问题