貓咪召喚分身打掃,給定開始的身高和最後打掃的貓咪數,計算沒工作的貓和身高總和
[心得]
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;
}