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”吧。写了段代码,编译、运行、成功!嘿嘿,总算往最后的胜利跨出了坚实的一步!
- #include <stdio.h>
- int main (void)
- {
- int i, n, m;
- m=1;
- printf ("n=?/n");
- scanf ("%i", &n);
- for (i=1; i<n; i++){
- m=10*m+1;
- }
- printf ("%i/n", m);
- return 0;
- }
按照刚刚的构想,把“11…11”乘以项数就等于该数了,至于求和就简单了,在循环中来个“s+=”就OK了。于是加几个变量,多加个循环:
- #include <stdio.h>
- int main (void)
- {
- int i, n, m, s, u;
- m=1;
- printf ("n=?/n");
- scanf ("%i", &n);
- for (i=1; i<=n; i++){
- for (u=1; u<i; u++){
- m=10*m+1;
- }
- s+=m*i;
- }
- printf ("%i, s);
- return 0;
- }
也就在外面多加个循环罢了,刚刚没问题,这下子应该成功了吧。
可惜事与愿违,运行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这个赋值语句放到外循环中:
- #include <stdio.h>
- int main (void)
- {
- int i, n, m, s, u;
- printf ("n=?/n");
- scanf ("%i", &n);
- for (i=1; i<=n; i++){
- m=1;
- for (u=1; u<i; u++){
- m=10*m+1;
- }
- s+=m*i;
- }
- printf ("%i”, s);
- return 0;
- }
编译、运行,这次真的OK了。
刷新下页面,准备将自己的回答发上去,发现上面已经有三个回答了,哎……
最后
以上就是等待猫咪为你收集整理的我的C语言学习日志(三)的全部内容,希望文章能够帮你解决我的C语言学习日志(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复