第三十五课 问题求解方法——迭代
项目一 【另类求和】
求 Sn=a+aa+aaa+...+aa...a之值,其中 a是一个数字。
例如2+22+222+2222( 此时a=2,n=4),a和n均由键盘输入。
请在下面的代码基础上补充完整。
例如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=Sn+Tn;
count++;
}
printf("a+aa+aaa+...=%d\n",Sn);
return 0;
}
运行结果:
项目二 【反弹的皮球】
一球从的100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?
请在下面的代码基础上补充完整。
请在下面的代码基础上补充完整。
代码:
#include<stdio.h>
int main()
{
float sn=100.0,hn=sn/2;
int n;
for (n=2;n<=10;n++)
{
sn=sn+hn*2;
hn=hn/2;
}
printf("第10次落地时共经过%f米。\n",sn);
printf("第10次反弹%f米。\n",hn);
return 0;
}
运行结果:
项目三 【Bessel函数】
Bessel函数Jn(X)有以下的递推关系:
编写程序,利用递推关系,由任意的n和x≠0求Jn(X)。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
double jn,j1,j0,x;
int n,count=2;
printf("请输入x和n:\n");
scanf ("%lf%d",&x,&n);
j0=sin(x)/x;
j1=sin(x)/(x*x)-cos(x)/x;
while (count<=n)
{
jn=(2*count-1)/x*j1-j0;
j0=j1;
j1=jn;
count++;
}
printf("%4f",jn);
return 0;
}
运行结果:
项目四 【贪财的富翁】
一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我两分钱,第三天我仍给你十万元,你给我四分钱,....,你每天给我的钱是前一天的两倍,直到满一个月(30天),百万富翁很高兴,欣然接受了这个契约。请编程序,通过计算说明,这个换钱计划对百万富翁是否是个划算的交易。
提示:(1)需要计算出30天后陌生人给了百万富翁多少钱,百万富翁给了陌生人多少钱,然后才能做出判断;(2)想要看得清楚,可以选择列出每一天双方交易获得的钱数。
代码:
#include<stdio.h>
int main()
{
int i=1,t1=100000,sum1=0;
double sum2=0.0,t2=0.01;
while (i<=30)
{
sum1=sum1+t1;
sum2=sum2+t2;
t2=t2*2;
printf("第%d天,富翁得到%d,陌生人得到%.2f\n",i,sum1,sum2);
i++;
}
if (sum1>sum2)
printf("\n富翁稳赚");
else
{
if (sum1<sum2)
printf ("\n陌生人稳赚");
else
printf("\n公平交易");
}
return 0;
}
运行结果:
项目五 【在北京买房】
现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能赚40万。如果他想买这套房子,不贷款,不涨工资,没有其他收入,每年不吃不喝不消费,那么他需要几年才能攒够钱买这套房子?
代码:
#include<stdio.h>
int main()
{
int i=1,t2=400000;
double s1=2000000.0,s2=0.0,t1=0.0;
while (i<=80)
{
s1=s1+t1;
t1=s1*0.1;
s2=s2+t2;
printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);
i++;
}
if (s1<s2)
printf("%d年后,终于等到你。。\n",i);
else
printf("来世再努力吧!\n");
return 0;
}
运行结果:
扩展1:
这位软件工程师没有理财意识,不去投资,也不至于将现金堆在家里吧,至少应存到银行,吃点利息(考虑通胀因素,可能仍亏,但比放家里现金收益高也安全)。按存1年定期,重新求解上面的问题。
代码:
#include<stdio.h>
int main()
{
int i=1,t2=400000;
double s1=2000000.0,s2=0.0,t1=0.0,j2=0.0;
while (i<=80)
{
s1=s1+t1;
t1=s1*0.1;
j2=s2*0.015;
s2=s2+t2+j2;
printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);
i++;
}
if (s1<s2)
printf("%d年后,终于等到你。。\n",i);
else
printf("来世再努力吧!\n");
return 0;
}
运行结果:
扩展2:
软件工程师不涨工资不对。工作经验、效率逐年提高,这家公司不给涨,会找另一家给涨工资的公司做。假如每年工资涨5%,结果又是如何呢?
代码:
#include<stdio.h>
int main()
{
int i=1,t2=400000;
double s1=2000000.0,s2=0.0,t1=0.0;
while (i<=80)
{
s1=s1+t1;
t1=s1*0.1;
s2=s2+t2;
t2=s2*1.05;
printf ("第%d年,房价%.0f,积蓄%.0f\n",i,s1,s2);
i++;
}
if (s1<s2)
printf("%d年后,终于等到你。。\n",i);
else
printf("来世再努力吧!\n");
return 0;
}
运行结果:
不知道对不对啊,为什么怎样都买不到房啊。。。泪飘。。
知识点与总结:
1、迭代真的太精细了,把一些有关联的数据组成可代替的关系式,就形成了迭代的体系,一个解法也许有很多种,但是要找到一个精简又精确的就少了,应该多在这方面下功夫。
2、为了每次循环输出结果,可以把初值设置成0,或者在 printf 输出后的下一行进行 i++ 。
3、如果迭代的第一次循环把第二次的数据算进去了,可能是循环过程中迭代或循环体的位置靠前了,适当调整到输出的那个变量的后面。
2、为了每次循环输出结果,可以把初值设置成0,或者在 printf 输出后的下一行进行 i++ 。
3、如果迭代的第一次循环把第二次的数据算进去了,可能是循环过程中迭代或循环体的位置靠前了,适当调整到输出的那个变量的后面。
132