poj1207~递归和打表

来源:互联网 发布:淘宝天猫超市有客服吗 编辑:程序博客网 时间:2024/05/16 07:21

题意比较难懂

一个数字x,如果是奇数则x=x*3+1,否则x=x/2.,直到x=1,这个过程所经过的长度叫做“循环数”

题目给你2个数字i和j,求i和j区间中最大的循环数。

i可能大于j!

我的思路就是递归加打表,不过打表不能全打,因为范围可能会超大,比如(9999*3+1)=29998有点大啊,为了防止超出我的预想打表的时候定个范围

#include<iostream>#include<string>    #include<queue>#define M 10005using namespace std;int vis[M],num[M];int dfs(int x){int y,ans;if(x<M&&vis[x]==1) return num[x];  //x<M防止数组越界,超出的就不打表了,直接算if(x==1) return 1;         if(x%2==1)y=x*3+1;else y=x/2;ans=1+dfs(y);if(x<M)     //小于M就打表{num[x]=ans;vis[x]=1;}return ans;}int main(){int i,a,b,max,t;memset(vis,0,sizeof(vis));num[1]=1;while(scanf("%d%d",&a,&b)!=EOF){max=0;printf("%d %d ",a,b);if(a>b)         //陷阱!a不一定小于b{t=a;a=b;b=t;}for(i=a;i<=b;i++){dfs(i);if(num[i]>max)max=num[i];}printf("%d\n",max);}}



0 0
原创粉丝点击