手机
当前位置:查字典教程网 >编程开发 >C语言 >C语言初学者代码中的常见错误与问题
C语言初学者代码中的常见错误与问题
摘要:问题开灯问题有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的...

问题

开灯问题

有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("%dt",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;

}

【C语言初学者代码中的常见错误与问题】相关文章:

使用C语言中的time函数获取系统时间

深入分析C语言中结构体指针的定义与引用详解

C语言编程技巧 关于const和#define的区别心得

c语言:金币阵列的问题

C语言编程时常犯十八个错误小结

C语言高斯消元法的使用详解

浅析C语言头文件和库的一些问题

使用C语言实现CRC校验的方法

VC6.0常见编译错误提示附解决方法

解析C语言中位字段内存分配的问题

精品推荐
分类导航