手速:点击打开链接
一开始是大表看是否有规律,但是很遗憾没有
又想把所以的结果存在数组为1000000的内,很遗憾很慢
其实直接求……
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int hash[1000001];
void solve(int n)
{
int i,re=1,nn=n;
if(hash[n]!=-1) return;
while(n!=1)
{
if(n%2)
n=n*3+1;
else
n/=2;
re++;
}
hash[nn] =re;
}
int maxi(int i,int j)
{
int ans=-1;
for(int k=i;k<=j;k++)
{
if(hash[k]>ans)ans=hash[k];
}return ans;
}
int main()
{
int i,j,k,flag;
memset(hash,-1,sizeof(hash));
while(scanf("%d%d",&i,&j)!=EOF)
{
flag=0;
if(i>j) {swap(i,j);flag=1;}
for(k=i;k<=j;k++)
{
solve(k);
}
int ans= maxi(i,j);
if(flag) printf("%d %d %d\n",j,i,ans);
else printf("%d %d %d\n",i,j,ans);
}
return 0;
}
或者将结果都存储在数组中(记忆化)
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int hash[1000002];
void solve(int n)
{
int i,re=1,nn=n;
while(n>1)//写n!=1就死循环了
{
if(n<1000000&&hash[n]!=-1)
{re+=hash[n]-1;break;}
if(n&1)
n=n*3+1;
else
n/=2;
re++;
}
hash[nn] =re;
}
int maxi(int i,int j)
{
int ans=-1;
if(i>j) swap(i,j);
for(int k=i;k<=j;k++)
{
if(hash[k]>ans)ans=hash[k];
}return ans;
}
int main()
{
int i,j,k;
memset(hash,-1,sizeof(hash));
for(k=1;k<1000000;k++)
solve(k);
while(scanf("%d%d",&i,&j)!=EOF)
{
int ans= maxi(i,j);
printf("%d %d %d\n",i,j,ans);
}
return 0;
}