C语言初学者代码中的常见错误与问题_C 语言

问题
开灯问题

  有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;
}

时间: 2024-11-18 00:49:00

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

C++常见错误中英文对照表_C 语言

fatal error C1003: error count exceeds number; stopping compilation 中文对照:(编译错误)错误太多,停止编译 分析:修改之前的错误,再次编译 fatal error C1004: unexpected end of file found 中文对照:(编译错误)文件未结束 分析:一个函数或者一个结构定义缺少"}".或者在一个函数调用或表达式中括号没有配对出现.或者注释符"/*-*/"不完整等 fata

WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

原文:WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭 在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟踪处理.本文介绍我在我在我的框架里面使用WCF服务的时候,出现的一个常见错误的处理方法,它的提示信息是:基础连接已经关闭: 连接被意外关闭.这种情况我碰到的有两种,一种是返回DataTable的时候出现的,一种是返回实体类

艾伟也谈项目管理,敏捷实施中的常见错误

一些评论员写下了敏捷实施中一些常见错误和反模式.他们贴出了"Top X"列表,列出了需要避免的事项和他们曾在各种组织实现敏捷时见过的错误. Target Process的Michael Dubakov写了两篇博文:"10个敏捷实施中最常见的错误"(Part 1; Part 2 ).他认为"许多公司在敏捷实施中再三犯同样的错误." 他的常见错误列表如下: 1. 从一个工具开始敏捷开发是不同的.一个工具不会立刻产生影响,不会由于这一工具的存在而解决多

《精通Android 实例开发》——第1章,第1.13节搭建过程中的常见错误

1.13 搭建过程中的常见错误 1.13.1 实例说明 无论安装或搭建任何一个开发环境,都会不可避免地遇到一些意想不到的问题,这些问题可能是我们粗心造成的,也可能是使用系统环境的差异造成的.在下面的实例中,将简单介绍搭建Android开发环境中常见问题的解决方法. 1.13.2 最常见的3个错误 1.Android不能在线更新 在安装Android后,需要更新为最新的资源和配置.但是在启动Android后,经常能更新,弹出如图1-65所示的错误信息. Android默认的在线更新地址是https

jsp中使用iterator的内容无法显示出来,代码中哪里出现错误,见图

问题描述 jsp中使用iterator的内容无法显示出来,代码中哪里出现错误,见图 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//D

c++ 中__declspec 的用法详解_C 语言

c++ 中__declspec 的用法如下,想要了解的继续往下看吧. 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{ int a, b, c, d, e; }; 它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最

ASP.NET中Datagrid常见错误

asp.net|datagrid|错误 摘要:学习如何避免在使用 ASP.NET Datagrid 控件进行开发时可能发生的一些常见错误. Datagrid 控件是 Microsoft? ASP.NET 中功能最强.用途最广的 Web 控件之一,这一点已经得到了 ASP.NET 权威人士的认同.虽然 Datagrid 控件易于使用,但同样易于给使用者带来麻烦.以下是许多人所犯的一些错误,这些人包括从初学者到富有经验的 .NET 专家.您可以看到许多苦闷的使用者在 ASP.NET 新闻组和论坛就这

细数云计算应用程序部署中的常见错误

当很多企业在云计算中部署应用程序时,他们通常会犯下一些常见的错误.其中,最明显的常见错误通常集中于应用程序性能.应用程序安全性以及监控虚拟环境的工具.当然,也有一些其他的常见错误. 与在http://www.aliyun.com/zixun/aggregation/14039.html">私有云计算中部署应用程序相关的错误比在公共云计算中部署应用程序所面临的挑战更具紧迫性.IT企业负责管理私有云计算的实施工作,而如今的企业则更侧重于私有云计算而不是公共云计算. 企业不能完成必要的前期规划以

10个在文字排版/网页布局中的常见错误

这篇文章的目的是帮助设计者们和顾客们去理解好的排版技巧的重要性,当避免一些常见的错误的时候.请记住这些错误的大部分是主观的以及在项目.目标或环境能够被改变的 下面列出了10个在排版/布局中使用到的常见错误,这些错误可能在你设计的效果和外观中产生大的影响.当在考虑印刷时它能为你节省时间和金钱. 1.没有足够的行间距(leading) 行间距/leading能改善整页中文字块的阅读效果,这样做是为了当读者阅读下一行的时候不会找不到他们的位置.太小文字可能引起一种受压迫感.记住不同的字体需要不同的行间