我是靠谱客的博主 等待猫咪,最近开发中收集的这篇文章主要介绍我的C语言学习日志(三),觉得挺不错的,现在分享给大家,希望可以做个参考。

C语言编程:S=1+22+333+4444+…+n…n
        这是在百度知道看到的一个问题。初看好像很简单,比1+2+3+…+99+100难不了多少,不过自己动手开始写问题就来了。
        一开始想用个循环把每一项的数字算出来,结果发现自己搞不定……这个式子每一项数字的位数和项数本身相关(第几项就有几位数),似乎很简单,但是仔细想才发现,不是n*10的问题,而是10的n次方的问题。我硬想通过一两个循环把每一项都算出来,可惜能力有限,越搞越头晕。
        只能另想办法了。不禁感叹算法果然是十分重要啊!自己一文科专业背景初学C,还没看过任何算法的书,现在这么有规律的数列都整不出来……
        后来干脆一步一步来,先算出“11…11”这样的数,保证1的数量和n相同,然后再乘以n就是每一项的数字,最后在把它们加起来。
        为了保证自己不出错,我打算干脆一小块一小块的写,心想只要我每一个步骤都用小段程序实现了,剩下的就是“组装”了。
        先实现“11…11”吧。写了段代码,编译、运行、成功!嘿嘿,总算往最后的胜利跨出了坚实的一步!

Code:
  1. #include <stdio.h>   
  2. int main (void)   
  3. {   
  4.  int i, n, m;   
  5.  m=1;   
  6.   
  7.  printf ("n=?/n");   
  8.  scanf ("%i", &n);   
  9.   
  10.  for (i=1; i<n; i++){   
  11.   m=10*m+1;   
  12.  }     
  13.     
  14.  printf ("%i/n", m);   
  15.  return 0;   
  16. }   


        按照刚刚的构想,把“11…11”乘以项数就等于该数了,至于求和就简单了,在循环中来个“s+=”就OK了。于是加几个变量,多加个循环:

Code:
  1. #include <stdio.h>   
  2. int main (void)   
  3. {   
  4.  int i, n, m, s, u;   
  5.  m=1;   
  6.   
  7.  printf ("n=?/n");   
  8.  scanf ("%i", &n);   
  9.   
  10.  for (i=1; i<=n; i++){   
  11.   for (u=1; u<i; u++){   
  12.    m=10*m+1;   
  13.   }   
  14.   s+=m*i;   
  15.  }   
  16.   
  17.  printf ("%i, s);   
  18.  return 0;   
  19. }   
  20.   


        也就在外面多加个循环罢了,刚刚没问题,这下子应该成功了吧。
        可惜事与愿违,运行n=1,n=2还没事,到了n=3就开始出问题了,输出居然是3356!怎么会变成4位数了呢?!明明内循环之前试验的时候没问题啊!
        由于n=2是s=23没错,那么几乎可以肯定到了n=3是,第三个数不是333,而是3333了。可是怎么会这样呢?我这内循环语句可什么都没加啊,我还注意了u<i而不是u<n呢!
        瞪着代码看了半天,在草稿纸上算了半天,自己的算法设计的应该没问题的嘛!
        就在我处于放弃边缘,准备到网上发帖求助的时候,最后一次从头到尾的浏览自己编写的代码,终于仿佛灵光一闪让我找到了问题可能存在的地方!
        m的值在经过循环后,就已经不再是1了,也就是说当外循环开始一轮新的循环时,内循环中的m的值实际是上个循环下最终的m的值。所以,n=2时没有出错,因为n=1是内循环因为u<i的关系直接被跳过去了,而n=3时,内循环中m的值是从10开始的而不是1,所以单独运行没有出错的那小段代码放到另一个循环中就不对了。
        谢天谢地,折腾了半天总算让我找到问题了。由于每次内循环都需要m从1开始计算,所以将m=1这个赋值语句放到外循环中:
 

Code:
  1. #include <stdio.h>   
  2. int main (void)   
  3. {   
  4.  int i, n, m, s, u;   
  5.   
  6.  printf ("n=?/n");   
  7.  scanf ("%i", &n);   
  8.   
  9.  for (i=1; i<=n; i++){   
  10.   m=1;   
  11.   for (u=1; u<i; u++){   
  12.    m=10*m+1;   
  13.   }   
  14.   s+=m*i;   
  15.  }   
  16.   
  17.  printf ("%i”, s);   
  18.  return 0;   
  19. }   
  20.   

        编译、运行,这次真的OK了。
        刷新下页面,准备将自己的回答发上去,发现上面已经有三个回答了,哎……
 

最后

以上就是等待猫咪为你收集整理的我的C语言学习日志(三)的全部内容,希望文章能够帮你解决我的C语言学习日志(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部