鱼C论坛

 找回密码
 立即注册
查看: 2693|回复: 5

[已解决]【C】开关灯的数学问题

[复制链接]
发表于 2022-10-5 16:56:39 | 显示全部楼层 |阅读模式
5鱼币
题目如下 QQ图片20221005165456.png
代码如下,不知道问题出在哪了,运行时没有输出
#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[5000]={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[i]=-1;
        }

        for(i=0;i<m;i++)      //第二个人将编号为2倍数的灯打开
        {
                if((i+1)%2==0)a[i]=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[i]=-a[i];   //采用j+1是由于数组从0开始,灯的数量从1开始
                }

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

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


        return 0;
}

最佳答案

查看完整内容

仔细看了你的代码,我觉得你的代码,核心是没有那么多的灯,从始至终,对一盏灯power开关了m*n次。 我的思路是:这个题目给出灯的数量不大于5000,要挨个校验,那么考察的应该是数组,将灯的数量作为数组,而灯的亮灭作为数组元素的值。所有人员挨个操作,那么就应该是利用计算机运行速度快的特性,每一个人,将所有灯遍历一遍,也就是作为循环元素处理。最终的结果输出,就是再次遍历数组,将符合结果要求的数组编号输出出来。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 16:56:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 顶级太阳 于 2022-10-6 10:10 编辑

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

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

        for(i=0;i<m;i++)      //第二个人将编号为2倍数的灯打开
        {
                if((i+1)%2==0)a[i]=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[i]=-a[i];   //采用j+1是由于数组从0开始,灯的数量从1开始
                }

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

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


        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 18:07:09 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-6 10:39 编辑
#include <stdio.h>

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

D:\[00.Exerciese.2022]\C>x
10 10
1,4,9

D:\[00.Exerciese.2022]\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:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[n+1];
        for(i=1;i<=n;i+=1)
        {
            if(i%2)l[i]=1;
            else l[i]=0;
        }
        for(i=3;i<=m;i+=1)
        {
            for(j=1;j*i<=n;j+=1)
            {
                l[j*i]=!l[j*i];
            }
        }
        for(i=1;i<=n;i+=1)if(l[i])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   961  1024  1089  1156  1225  1296  1369  1444  1521  1600  1681  1764  1849  1936  2025  2116  2209  2304  2401  2500  2601  2704  2809  2916  3025  3136  3249  3364  3481  3600  3721  3844  3969  4096  4225  4356  4489  4624  4761  4900
Process returned 0 (0x0)   execution time : 6.460 s
Press any key to continue.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 12:32:21 | 显示全部楼层
本帖最后由 顶级太阳 于 2022-10-7 12:33 编辑

            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 00:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表