【项目1:分数的累加】
编程序,输出1/3-3/5+5/7-7/9…+19/21的结果
提示:如果直接解决上面的问题有困难,可以设计一条“由易到难”的路线,逐渐解决其中要解决的问题,让自己的思路明朗起来。
(1)1+2+...+20 ——这个应该会
(2)1+1/2+1/3+…+1/20 ——分数的累加,注意两个整型相除,商也为整型,而显然求和结果应该是小数
(3)1/2+2/3+3/4+…+19/20 ——分子不全是1了,找找规律,稍加改动就好了
(4)1/2-2/3+3/4-…+19/20 ——要累加的值一正一负倒腾,用pow(-1,i)是个效率很低的做法,不推荐使用。技巧:专门设置一个变量s表示累加项的符号,取值随着循环,每次乘以-1,从而在+1、-1之间变化,循环加求和的累加要用累加的项(i/(i+1))乘以这个表示符号的s。
编程序,输出1/3-3/5+5/7-7/9…+19/21的结果
提示:如果直接解决上面的问题有困难,可以设计一条“由易到难”的路线,逐渐解决其中要解决的问题,让自己的思路明朗起来。
(1)1+2+...+20 ——这个应该会
(2)1+1/2+1/3+…+1/20 ——分数的累加,注意两个整型相除,商也为整型,而显然求和结果应该是小数
(3)1/2+2/3+3/4+…+19/20 ——分子不全是1了,找找规律,稍加改动就好了
(4)1/2-2/3+3/4-…+19/20 ——要累加的值一正一负倒腾,用pow(-1,i)是个效率很低的做法,不推荐使用。技巧:专门设置一个变量s表示累加项的符号,取值随着循环,每次乘以-1,从而在+1、-1之间变化,循环加求和的累加要用累加的项(i/(i+1))乘以这个表示符号的s。
(5)1/3-3/5+5/7-7/9…+19/21 ——这是我们的目标。品品这种思路,一口吃不成胖子,学会一口一口吃饭。用心编程,再大的障碍,也会一个一个地排除。
#include "stdio.h"
int main()
{
double sum=0,i,s=1;
for(i=1.0;i<20;i+=2)
{
sum=sum+i/(i+2);
sum=sum*s;
s=-s;
}
printf("%f",sum);
}
运行结果
心得 注意定义变量应为double型。因为求和 为小数,所以i=1.0,又因为i是小数分子上的,应该循环19次。
【项目2:麻烦的累加涨功夫】
计算(1)
#include "stdio.h"
int main()
{
double s=0,i,t=0.5,x,y=1.0;//s为和,i为循环次数,x是中间变量,t为底数,y为调整符号。
for(i=0;i<=8;i++)
{
t*=2;
x=1.0/t;
x*=y;
s+=x;
y=-y;
}
printf("%f",s);
return 0;
}
//变量,步骤偏多。可以优化。各语句之间的顺序错了好几回。
运行结果
心得 变量,步骤偏多。可以优化。各语句之间的顺序错了好几回。故附上老师的代码,如下。
#include <stdio.h>
int main( )
{
int i,m=1; //m表示2的幂,1为2的0次幂,与循环相符
double sum=0, s=1.0; //s直接取double型,保证除的结果是浮点型
for(i=0; i<=8; ++i)
{
sum=sum+s/m;
m*=2; //2的i次幂由此计算得到
s=-s;
}
printf("%f\n", sum);
return 0;
}
(2)
#include "stdio.h"
int main()
{
int i,t=1;//i为循环,t为阶乘
double f=0,s=1.0;
for(i=1;i<10;++i)
{
t*=i;
f=f+s/t;
//f*=s;//直接把s提到分子上,不要再乘f,否则f的值会正负变化。
s=-s;
}
printf("%f\n",f);
}
运行结果
心得 那个f*=s那一步是错误的,可以直接把s提到分子上,不要再乘f,否则f的值会正负变化。再附上老师的代码。
#include <stdio.h>
int main( )
{
int i,f=1; //f表示加数分母上的阶乘,初值1为1的阶乘
double sum=0, s=1.0; //s直接取double型,保证除的结果是浮点型
for(i=1; i<=9; ++i)
{
f*=i; //计算得到i的阶乘
sum=sum+s/f;//1楼指出的错误表达式是sum=sum+s*i/f;
s=-s;
}
printf("%f\n", sum);
return 0;
}