#include<bits/stdc++.h>
using namespace std;
int f(int);
int main()
{
int m,temp,temp2;
int i,count1,count2;
while(scanf("%d",&m)>0)
{
for(i=1;i<1000000;i++)
{
temp=f(i);
if(temp>m)
{
temp2=f(i-1);
break;
}
}
count1=abs(temp-m);
count2=abs(m-temp2);
if(count1>count2) printf("%d\n",count2);
else printf("%d\n",count1);
}
return 0;
}
int f(int a)
{
if(a==0) return 0;
else if(a==1) return 1;
else return(f(a-1)+f(a-2));
}
这题真是纠结了好长时间,一直没有找到错误,在接近绝望的时候才发现,可能是输出结果忘记加上换行符造成的。但是这题也给了我一点别的启发。首先这最近才开始使用安科的OJ平台,发现安科的平台有一个特点,输入喜欢连续输入连续输入,我先开始考虑使用while(1)来实现,后来发现这样会造成内存超限,于是借鉴了大神们的while(scanf("%d",&m)>0)
,果然解决了问题。
其次这题通过和赵老师沟通发现,使用双重递归复杂度是指数,会超时或者爆栈。虽然这题没有出现,但是值得引以为鉴。