递归:蟠桃记
从外到内的深入挖掘。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
long long f(int n)
{
if (n==1) return 1;
return 2*(f(n-1)+1);
}
int main()
{
int n;
while (cin>>n)
{
cout<<f(n)<<endl;
}
return 0;
}
注意:2连续×30次,保险起见用long long .
菲波那切数列
int f(int n)
{
if (n==1||n==2)
return 1;
return f(n-1)+f(n-2);
}
递推:斐波那契数列
一层层地推进。
开数组,
a[1]=a[2]=1;
for (i=3;i<100;i++)
a[i]=a[i-1]+a[i-2];
但是斐波那契用递归最多算到49左右就卡住了,因为每一层递推都需要时间啊!所以开数组是一种更快的方式。
OJ67 循环节问题
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
int a,b,n,data[101],i;
data[1]=data[2]=1;
while (scanf ("%d %d %d",&a,&b,&n)!=-1)
{
if (a==0&&b==0&&n==0)
break;
if (n<3)
cout<<"1"<<endl;
else
{
for(i=3;i<50;i++)//循环节多大怎么估算
{
data[i]=(a*data[i-1]+b*data[i-2])%7;
if (data[i]==1&&data[i-1]==1)
break;
}
n=n%(i-2);
if (n==0)
cout<<data[i-2]<<endl;
else
cout<<data[n]<<endl;
}
}
return 0;
}
大致思路:
1.输入a,b,n
2. 开数组,大致估算循环节的长度,把循环节输入直到一个循环节的结束。
3. 但是1 1 0 4 5 1 1,所以用n%(i-2),有两种情况0或者1 2 3 4 5分别对待。
4. i-2>0,所以i>3,再讨论
自动找出循环节
for(i=3;i<=49;i++)
{
data[i]=(a*data[i-1]+b*data[i-2])%7;
if (data[i]==1&&data[i-1]==1) break
OJ70
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
int ha(int n)
{
if (n==0) return 1;
if (n==1) return 2;
return (ha(n-1)+ha(n-2))%3;
}
int main()
{
int n;
while (cin>>n)
{
n=n%8;
if (ha(n)==0)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}