您的位置:首页 > 其它

第三十五讲|问题求解方法——迭代

2015-07-15 17:21 253 查看
【项目1:另类求和】

求 Sn=a+aa+aaa+...+aa...a之值,其中 a是一个数字。

例如2+22+222+2222( 此时a=2,n=4),a和n均由键盘输入。

#include "stdio.h"
int main()
{
	int a,n,count=1,Sn=0,Tn=0;
	printf("请输入a和n的值:\n");
	scanf("%d,%d",&a,&n);
	while(count<=n)
	{
		Tn=Tn*10+a;
		Sn+=Tn;
		count++;//n已为常量不可以++
	}
	printf("a+aa+aaa+...=%d\n",Sn);
	return 0;
}
运行结果



心得 当时编这条的时候思维注意不是太集中。Tn=Tn*10+a一开始想起来,不知道为什么没写,费解。

变量太多,一不留神count++写成了n++,n为常量,常量不可以使用自增自减符。变量多以后记得在语句后面加上备注//。

【项目2:反弹的皮球】

一球从的100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?

#include "stdio.h"
int main()
{
	float sn=100.0,hn=sn/2;
	int n;
	for(n=2;n<=10;n++)
	{
		sn+=(2*hn);
		hn/=2;
	}
	printf("第十次落地时共经过%f米\n",sn);
	printf("第十次反弹%f米\n",hn);
	return 0;
}


运行结果



心得 之前把过程理解错了,只求了经过高度的一半。还有循环次数也搞错了,应该是9次,因为第一次就是你丢的过程。

【项目3:Bessel函数】

Bessel函数Jn(X)有以下的递推关系:



编写程序,利用递推关系,由任意的n和x≠0求Jn(X)。

#include "stdio.h"
#include "math.h"
int main()
{
	int i,n;
	double x,J0,J1,Jn;
	printf("请输入n,x。\n");
	scanf("%d,%lf",&n,&x);
	J0=sin(x)/x;
	J1=sin(x)/x*x-cos(x)/x;
	for(i=1;i<=n;i++)
	{
		Jn=(2*i-1)*J1/x-J0;//J(n+1)=(2n+1)/x*Jn-J(n-1)x
		J0=J1;
		J1=Jn;
	}
	printf("Jn = %.4f\n",Jn);
}
//注:变量jn代表的实际是公式中的jn+1,推导一下,2*i-1,而不是2*i+1,这是对的


运行结果



心得 还是迭代没有深刻理解好。jn,j1,j0三者互相表示,以求迭代。还有个2*i-1需要认真思考。因为迭代没有理解好,所以附上两个课堂事例。

例一 Fibonacci数列

有fn

#include "stdio.h"
int main()
{
	long f1,f2,fn;
	int i;
	f1=f2=1;
	printf("%ld\t%ld\t",f1,f2);
	for(i=3;i<=40;i++)
	{
		fn=f1+f2;
		printf("%ld\t",fn);
		if(i%5==0)
			printf("\n");
		f1=f2;
		f2=fn;
	}
}


没有fn

#include "stdio.h"
int main()
{
	long f1,f2;
	int i;
	f1=f2=1;
	for(i=1;i<=20;i++)
	{
		printf("%ld\t%ld\t",f1,f2);
		if(i%2==0)
			printf("\n");
		f1=f1+f2;//左f1代表第3个数,是第1、2数之和 
		f2=f2+f1;//左f2代表第4个数,是第2、3数之和 
	}
}
其中里面还是有个小技巧的,输出几个就换行。if(i%2==0) printf("\n");

例二 级数公式

#include "stdio.h"
#include "math.h"
int main()
{
	double x,sum=1,term=1;
	int i=1;
	scanf("%lf",&x);
		while(fabs(term)>=1e-5)
		{
			term=term*(-1)*x*x/((2*i)*(2*i-1));
			sum=sum+term;
			i++;
		}
		printf("%f\n",sum);
}


心得 再看一下pdf文件中,term的推导过程。好好体味一下迭代。



【项目4:贪财的富翁】

一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我两分钱,第三天我仍给你十万元,你给我四分钱,....,你每天给我的钱是前一天的两倍,直到满一个月(30天),百万富翁很高兴,欣然接受了这个契约。请编程序,通过计算说明,这个换钱计划对百万富翁是否是个划算的交易。

提示:(1)需要计算出30天后陌生人给了百万富翁多少钱,百万富翁给了陌生人多少钱,然后才能做出判断;(2)想要看得清楚,可以选择列出每一天双方交易获得的钱数。

#include "stdio.h"
int main()
{
	int i;
	double a=0,b=0.01;
	for(i=1;i<=30;i++)
	{
		a=a+100000;
		b*=2;
		printf("%lf\n%lf\n",a,b/2);
	}
	printf("%lf\n%lf\n",a,b/2);
}


运行结果





【项目5:在北京买房】

现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能赚40万。如果他想买这套房子,不贷款,不涨工资,没有其他收入,每年不吃不喝不消费,那么他需要几年才能攒够钱买这套房子?
#include "stdio.h"
int main()
{
	int year=0,salary=400000;
	double house_price=2000000;
	while(house_price>=salary)
	{
		//salary*=1.05;
		salary+=400000;
		house_price*=1.10;
		year++;
	}
	printf("%d年后才能攒够钱买房。",year);
}
运行结果
永远买不起。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: