貓咪召喚分身打掃,給定開始的身高和最後打掃的貓咪數,計算沒工作的貓和身高總和

[心得]

1.使用 log 的誤差很難控制...改成使用"pow(n,k)==最後打掃的貓咪數"來找 n 和 k

2.pow() 的形態是 float,要改成 int 或使用 abs(pow(n,k)-end)<=0 來判斷條件是否成立

3.pow(x,y) 等於 exp(y*ln(x)),所以會有誤差要小心使用

4.執行時間最快只能到1.636秒,降不下去 ~"~

 

#include <stdio.h>
#include <math.h>

int main()
{
    long int start,end,unwork,height,n,k,i,j,flag;
   
    while(scanf("%ld %ld",&start,&end)!=EOF)
    {
        if(!start&&!end) break;
        unwork=0; height=0; flag=0;
               
        if(start==1&&end==1)
            printf("0 1\n");
        else
        {
            for(n=1;;n++)
            {
                for(k=1;(long int)pow(n+1,k)<=start;k++)
                {
                    if((long int)(pow(n+1,k)-start)==0&&(long int)(pow(n,k)-end)==0)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag) break;
            }
            /*printf("n=%ld k=%ld pow(n+1,k)=%ld\n",n,k,(long int)pow(n+1,k));*/
           
            for(i=0,j=1;i<=k-1;i++)
            {
                unwork+=j;
                j*=n;
            }           
            for(j=1;start>=1;start/=(n+1))
            {
                height+=j*start;
                j*=n;
            }           
            printf("%ld %ld\n",unwork,height);
        }
    }
   
    return 0;
}

arrow
arrow
    全站熱搜

    RingsACM 發表在 痞客邦 留言(0) 人氣()