解题思路:
第一年年底,房价200万,第一年一整年下来,他手头上有了N万;第二年年底,房价200*(1+K*0.01)万【从数学上来说,百分号K 可以等于K*0.01】,他今年工资一共N万,加上去年一整年的工资,他手头上有了2*N万;第三年年底,房价200*(1+K*0.01)*(1+K*0.01)万,他第三年年收入N万,加上去年身上的钱,此时他手头上有了3*N万;以此类推,第M年,房价200*【(1+K*0.01)的(M-1)次方】,他手头上有了M*N万
2. 当他手头上的钱>=房价【 M*N>=pow( (1+K*0.01),(M-1) ) *200 】的时候,并且是在二十年内【M<=20】,那么我们就输出具体的年份;否则我们就输出 Impossible(意思是,不可能的,不可能买得起)
注意事项:
pow(a,b)可以简单理解为b的a次方的意思,但是其实pow函数为了防止精度损失有一些建议的使用要求,这里就不说太多了
所以,房价200*【(1+K*0.01)的(M-1)次方】其实就是 pow( (1+K*0.01),(M-1) ) *200
2. 那我们要如何让计算机计算出正确的 年份M 呢?
我们可以让计算机一个年份一个年份的去尝试,看在20年内哪个年份符合条件哪个年份就是我们想要的 年份M ,都不符合那么M>20,就输出不可能买得起
那么我们就可以用 for循环 让计算机实现一年一年的去尝试,去排查,从第一年排查到第二十年,最多循环20次 就是for ( M=1 ; M<=20 ; M++ )
3. 如果我们在循环的过程中刚好遇见了我们要的 年份M,【if (pow( (1+K*0.01),(M-1) ) *200 <= M*N)】
那么我们就可以让循环停下来了,告诉计算机这个就是我要的数据,你把它输出出来,然后把你的循环停下来,你再循环对你也没用了,因为你已经成功排查出 了我想要的东西了,后面再没有了【printf ( "%d",M ) ; break ;】
4. 那我们要如何去判断 年份M 有没有大于20年呢?
我们可以通过 年份M 最后的循环结果 M年 来判断
由于如果M>20,我们没办法直接判断 直接记录 所以我们可以引入一个新的变量 year 来辅助记录 M 的最终循环结果【year=M;】【year++;】
如果循环结束了,M 的最终结果,即 year >20 ,那么我们就输出impossible,他不可能买得起
【if(year>20) printf("Impossible");】
参考代码:
#include
#include
int main ( )
{
int M , K ,N , year ;
scanf ( "%d %d\n",&N, &K ) ;
for ( M=1 ; M<=20 ; M++ )
{
year=M ;
if ( pow( (1+K*0.01) , (M-1) ) *200 <= M*N )
{
printf ( "%d",M ) ;
break ;
}
year++ ;
}
if ( year > 20 ) printf( "Impossible" ) ;
return 0 ;
}
0.0分
0 人评分
A+B for Input-Output Practice (C语言代码)浏览:505 |
1048题解(读入回车问题)浏览:628 |
字符逆序 (C语言代码)浏览:675 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:826 |
核桃的数量 (C语言代码)浏览:874 |
C语言训练-"水仙花数"问题1 (C语言代码)浏览:781 |
简单的事情 (C语言代码)浏览:589 |
WU-C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:1353 |
WU-C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:688 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:421 |