0x13:啊!我疯了
今天作业要求:计算1/2+2/3+3/5+…的前二十项和
没想到高中的令人疯狂的数列居然又来了I…
观察规律到简单的很:无非就是后一项的分母是前一项的分子与分母的和,后一项的分子是前一项的分母。
所以当务之急是先把后一项的分母是前一项的分子与分母的和这一块做出来
于是想到了今天学到的数组(实际上想了半天才想出来的…)
简单的demo写出来了
#include <stdio.h> int main() { int f[20]={1,2}; int n,j; for(j=2;j<=19;j++) { f[j]=f[j-1]+f[j-2]; printf("%d\n",f[j]); } }
现在的思路无非就是把分母、分子赋值。
经过超长时间的尝试(这里省略太呆了)
终于写成了下面这个样子:
#include <stdio.h> int main() { int f[20]={1,2,3}; int n,j,fz,fm; double fs,sum; for(j=3;j<=19;j++) { f[j]=f[j-1]+f[j-2]; fm=f[j]; printf("fm=%lf\n",fm); // printf("%d\n",f[j]); fz=f[j-2]+f[j-3]; printf("fz=%lf\n",fz); fs=fz/fm; printf("%lf\n",fs); } }
结果..
直接输出0.0000
正当我为此绝望的时候突然想起了数据类型不太对
害,不对我直接全部改成double类型呗
结果数组改成double类型直接给我来了致命一击,提示错误….
那我把分母,分子改成double类型?
又是致命一击,仍然不对。(错误提示与数组改成double相同)
于是只好想起来C语言中的一项压箱底绝技:强制类型转化
转!
变成了下面这个模样:
可以说离成功就差一个sum了,哈哈哈..
正当我洋洋得意的时候,我发现事情并没有这么简单
我发现打印出现了些许的问题…
嗯??这…这是哪来的鬼数据
(其实倘若我不瞎,看到了下面的叹号提醒我
就不会花费十分钟的时间先把sum初始化为0然后还是错误,巴拉巴拉整半天最后发现是:)
Double类型居然用%d输出,这能对???
终于,在我解决完最后这个bug的时候,一切都是那么祥和,安详。
经过一晚上的历练终于成为了和尚。(对了,最后要把项数问题整对了前两项直接加,1/2+2/3我们从第三项开始加,到第二十项结束,也就是说我们的循环必定不是19次,而是…18次)
修改细节:
写在最后:
啊*!没想到这么长时间调试,修改,整理,运算,最后写出来的不过这24行的代码(其中还有各种换行空格与花括弧i)
当然大家在定义数组的时候要注意了:如果你定义了一个a[],那么你就不要再定义Int a了。
#include <stdio.h> int main() { int f[20]={1,2,3}; int n,j,fz,fm; double fs,sum=0; for(j=3;j<=18;j++) { f[j]=f[j-1]+f[j-2]; fm=f[j]; printf("fm=%lf\n",(double)fm); // printf("%d\n",f[j]); fz=f[j-2]+f[j-3]; printf("fz=%lf\n",(double)fz); fs=(double)fz/(double)fm; printf("%lf\n",fs); sum=fs+sum; printf("sum=%lf",sum); } printf("final result=%lf",1/2+2/3+sum); }