搜索
查看: 2583|回复: 6
打印 上一主题 下一主题

输入一个整数n(1<=n<=9),求n 的阶乘,小问题

[复制链接]
楼主
发表于 2014-1-26 19:06:02 | 显示全部楼层
本帖最后由 981013 于 2014-1-27 13:55 编辑

这段代码问题很多……{:soso_e127:}
首先要认识到,计算机执行代码的顺序和你写代码的顺序是一样的,因为你先写了
scanf("%d",&n);
然后才是

  1. printf("重新输入\n");
复制代码
因此计算机照着执行,即先等待用户输入一个值,再输出“重新输入”。
而且,这里你用的是if(n<=1||n>=9)
如果按你的要求,即输入的值为1~9(包含1和9)的数字,那么也就是说n<1||n>9这个范围内的数才是不合法的,若按n<=1||n>=9来做,输入1和9时就会出问题,且你没有考虑到若用户输入的第二个值仍不合法怎么办(此时应不断要求用户输入值,直至输入数据合法为止),因此该句应改为
  1. while(n<=1||n>=9)
复制代码
接下来一句if(1<=n<=9)
这句不管是从程序流程还是语句本身来说都没有用途,首先前面的语句已经确保1<=n<=9了。然后,C语言不支持判断一个数是否大于(等于)一个数的同时还小于(等于)另一个数(有点绕),即if(0<a<10),while(1000>=a>=99)这类语句都是不正确的,在啊哈C这里这类语句不会被当做是错误,但无论如何()内的表达式始终被认为是真,例如:
  1. while(1<=a<=99)
  2. {
  3. printf("yes\n");
  4. a++;
  5. }
复制代码

这一段不论a的值为-1,0,100,1000,50或是什么其他的数,都会永不停止的打出yes,即发生了死循环。
因此在进行这类判断时,因写成if(n>=1&&n<=9)的形式。

另外:

  1. m=m*i;
  2. i=i+1;
复制代码
可以简写成:
  1. m*=i;
  2. i++;
复制代码
最后附上完全修改完后的代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n,m,i;
  6. i=1;
  7. m=1;
  8. scanf("%d",&n);
  9. while(n<1||n>9)
  10. {
  11. printf("重新输入\n");
  12. scanf("%d",&n);
  13. }
  14. while(i<=n)
  15. {
  16. m=m*i;
  17. i=i+1;
  18. }
  19. printf("%d\n",m);
  20. system("pause");
  21. return 0;
  22. }
复制代码


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

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表