循环语句的一道题的小细节【C循环求阶乘和】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、循环语句

1.while语句
最简单的循环语句,格式为:
while(表达式)
语句;(注意:表达式可以是任何类型语句,仅仅判断此语句是否为0,若非0则执行语句,还要记得初始化循环控制变量。)
2.do—while语句. 和while语句类似,格式如下
do 语句;
while(表达式);
和while语句的区别在于,先执行do语句然后判断while的循环控制变量,也就是说,此语句至少执行一次,注意不同情况的使用。
另外,如while语句一样,记得初始化循环控制变量。

3.for语句,比较方便的循环语句,具体格式如下:
for(表达式1,用来赋初值;表达式2,就是循环控制变量;表达式3,改变循环控制变量)
语句;(其实就是循环体)
注意:for后面的括号不能省,但如果赋过初值或循环体有终止语句,改变变量,里面的表达式可以省略,但分号依旧不能省。

二、注意事项(易错点)

我们拿例子来说:
编写一个程序,任意输入n,求S=1!+2!+…+n!。
注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0。
提示:(n+1)!=n!(n+1)*
例如:
输入:10
输出:4037913;
这是一道C循环求阶乘和的题,我们乍一看好像简单,知道这是要用循环来解决,但是仔细想来,求和要用一次循环,求每个数的阶乘又是一次循环,这是一道典型的循环嵌套问题,同时要考虑到,输入是0或者1时的问题,也就是说还要用到选择结构分支;那么循环嵌套里面外面分别用什么语句,循环嵌套用什么语句?都是问题,用Switch合适不合适?此外还有一开始定义变量,定义几个?要不要赋初值?都是问题。
下面是这道问题问题我的答案。


  #include<stdio.h> 	
  int main(void) 	
  {	  int n,m,p,sum=1;
          scanf("%d",&n);
          if(n<0)
          printf("0");
          else if(n==0)
          printf("1");
          else
          {
              for(;n>1;n--)
              {
                  for(m=n,p=1;m>1;m--)
                 p=m*p;
                  sum=p+sum;
              };
              printf("%d",sum);
          };
  
           return 0; 	}

写这类循环嵌套问题最好画一下流程图,最初我们面对简单的问题很容易搞清楚逻辑,上手就能写出程序,但是随着循环嵌套层数越来愈多,或者调用的函数越来越多,我们发现,这些程序并不能靠脑子心算就能简单得出,所以要画流程图。
以上答案首先用分支语句if else将输入的情况分开三个分支,然后当n>0时使用循环语句,因为不知道循环次数,使用for或者while语句都行,这里使用for语句方便理解一些。
内层循环语句是让不断减少的数字求阶乘,但是最后要求和,只求一个阶乘是没有用的,所以有了外层循环,外层循环是让输入的数字递减,直到1为止。
我主要耗费时间的点在于区分开内层循环和外层循环的变量,以及如何让内层循环的变量的改变不会影响外层循环的变量,又要保证外层循环的变量自减的同时赋值给内层循环,这里定义了一个中间值m,让内层循环不影响外层循环,因为外层n变化后,每次执行内层循环的时候把n赋值给m。
另外容易错的点,n>1,这个时候=1可以不可以,要注意一些小的细节,有的题里面是不影响的,比如在这道题里,但是如果有相加相减运算的时候,这些小细节可能差之毫厘谬以千里,程序代码是最死板的,灵活变通的是人的思维,我们要学会用更方便的函数调用与程序过程,让这个系统更耐用更好用更人性化,这是老师们经常说的程序员的自我修养。
还有sum这个值,考虑到虽然在内层循环里面但是除了一开始一直没有再次赋值,那么每次相加的时候都保留了上次阶乘的结果,最后得出的是所有阶乘的和。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值