栾静怡


私信TA

用户名:uq_69767536335

访问量:143

签 名:

小楫轻舟,已然梦入芙蓉浦。

等  级
排  名 4162
经  验 1744
参赛次数 1
文章发表 17
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

好好学习 天天向上 。

解题思路:

  1. 第一年年底,房价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(意思是,不可能的,不可能买得起)

注意事项:

  1. 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 人评分

  评论区

  • «
  • »