【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-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 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-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: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:33 编辑
页:
[1]