您的位置:首页 > 其它

第三十四讲|用循环累加

2015-07-14 08:38 495 查看
【项目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。

(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;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: