时间:2021-05-20
问题
开灯问题
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
复制代码 代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int a[1001],n,k,i,j;
printf("请分别输入灯和人的数量\n");
scanf("%d%d",&n,&k);
while(1) //检验是否超出
{
if(k>=1 && k<=1000 && n>=k && n<=1000)
break;
else
{
printf("数值不符,请重新输入:\n");
scanf("%d%d",&n,&k);
}
}
for(i=2;i<=k;i++) //每操作一次第i*j个开关,a[i*j]加1
{
for(j=1;i*j<=n;j++)
{
a[i*j]=a[i*j]+1;
}
}
for(i=1;i<=n;i++) //若操作次数为偶数,表示该位置的灯亮着
{
if(a[i]%2==0 && a[i]!=0)
printf("%d\t",i);
}
printf("\n");
return 0;
}
测试:
“自己测了觉得没问题..在线系统结果是WrongAnswer ..未找出原因..”
评:
最明显的错误就是第26行
复制代码 代码如下:
a[i*j]=a[i*j]+1;
由于前面定义a数组为局部auto类别,在不进行初始化的情况下,a中的数据是垃圾值。换句话说,a中的数据是无意义的。因此a[i*j]+1这个表达式没有意义。
此外,第22行
复制代码 代码如下:
for(i=2;i<=k;i++) //每操作一次第i*j个开关,a[i*j]加1
在逻辑上也是错误的,缺乏“第1个人把所有灯打开”的步骤。
另外
复制代码 代码如下:
printf("请分别输入灯和人的数量\n");
scanf("%d%d",&n,&k);
while(1) //检验是否超出
{
if(k>=1 && k<=1000 && n>=k && n<=1000)
break;
else
{
printf("数值不符,请重新输入:\n");
scanf("%d%d",&n,&k);
}
}
这段写得很丑,属于典型的谭浩强风格,C语言应该这样写:
复制代码 代码如下:
printf("请分别输入灯和人的数量\n");
while(scanf("%d%d",&n,&k) ,( k <1 || n<k || n>1000) )
{
printf("数值不符,请重新输入:\n");
}
代码中还有其他一些毛病,由于不是最主要的问题,这里就不再进一步指出了。
重构:
复制代码 代码如下:
#include <stdio.h>
#define MAXNUM 1000
#define ON 0
#define OFF 1
int main( void )
{
int light[MAXNUM] = { ON } ; //把所有灯打开
int n , k ;
int i ;
printf( "请分别输入灯和人的数量\n" );
while ( scanf("%d%d", & n ,& k ) ,( k < 1 || n < k || n > MAXNUM ) )
printf("数值不符,请重新输入:\n");
for ( i = 2 - 1 ; i < k ; i ++ ) //第2个人按下所有编号为2 的倍数的开关……
{
int j ;
for ( j = i ; j < n ; j += i + 1)
light[j] = ! light[j];
}
for ( i = 0 ; i < n ; i ++ )
if( light[i]==ON )
printf( "%d " , i + 1 );
putchar('\n');
return 0;
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言对于初学者们来说,刚开始编写Java代码时,会遇到很多困难,下面来说一个比较常见的错误,如下:初学者一般都是从Hello,World开始的学起的,废了好大劲
本文针对C语言初学者详细讲述了指针的用法,并配以实例进行说明。具体分析如下:对于C语言初学者来说,需要明白指针是啥?重点就在一个“指”上。指啥?指的地址。啥地址
。许多开淘宝网店的初学者在初期或多或少会遇到许多问题和错误。初学者白人们必须注意这些问题。如果不能立即解决的话,可能会直接影响自己店铺的经营和运营。初学者开淘宝
前言大家好~我是一名C语言初学者,学了C语言基础后,我制作了一个小游戏:剪刀石头布。希望大家能对我的思路和代码提出小Tips(eg.更简便的方法与程序)我也会虚
大家可能有印象。前几天,初学者卖方经常犯错误的报道,报道中提到了店铺选择的问题店铺水平的问题等,知道作为初学者经常犯什么样的错误后,我们最关心的是自然流量的问题