POJ(3n+1 problem的几种解法)

本文提供了两种不同的算法实现,一种采用预处理的方式提高求解数列最大值的效率,另一种则直接通过递归计算每个数的值并找出最大值。预处理方法通过事先计算好部分结果来减少重复计算,而第二种方法虽然简单但效率较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int p[10005];
 4 int fmax(int i,int j)
 5 {
 6     if(i>j)
 7         return i;
 8     else
 9         return j;
10 }
11 void ff()
12 {
13     int i,j,sum;
14     memset(p,-1,sizeof(p));
15     p[1]=1;
16     p[2]=2;
17     for(i=3;i<=10000;i++)
18     {
19         j=i;
20         sum=0;
21         while(1){
22             if(j%2 == 0)
23                 j/= 2;
24             else j=j*3+1;
25             ++sum;
26             if(j<=10000&&p[j]!=-1)
27                 break;
28         }
29         p[i]=p[j]+sum;
30 
31     }
32 }
33 int main()
34 {
35     int i,j,tpi,tpj,tp,sum,max,k;
36     ff();
37     while(scanf("%d%d",&i,&j)==2)
38     {
39         tpi=i;
40         tpj=j;
41         if(i>j)
42         {
43             tp=i;i=j;j=tp;
44         }
45         max=p[i];
46         for(k=i;k<=j;k++)
47             max=fmax(max,p[k]);
48         printf("%d %d %d\n",tpi,tpj,max);
49     }
50     return 0;
51 }

这种貌似是预先处理的方法。我也不知道具体叫什么来着。

View Code
 1 #include<stdio.h>
 2 int f(int n)
 3 {
 4     int i,j,sum=1;
 5     if(n==1||n==2)
 6         return n;
 7     else
 8     if(n>2)
 9     {
10         while(1)
11         {
12             if(n%2==1)
13             {
14                 sum++;
15                 n=n*3+1;
16             }
17             else
18             {
19                 sum++;
20                 n=n/2;
21             }
22             if(n==1)
23                 break;
24         }
25     }
26     return sum;
27 }
28 int max(int i,int j)
29 {
30     if(i>j)
31         return i;
32     else
33         return j;
34 }
35 int main()
36 {
37     int i,j,k,sum,tpi,tpj,tp;
38     while(scanf("%d%d",&i,&j)==2)
39     {
40         tpi=i;
41         tpj=j;
42         if(i>j)
43         {
44             tp=i;i=j;j=tp;
45         }
46         sum=f(i);
47         for(k=i+1;k<=j;k++)
48         {
49             sum=max(sum,f(k));
50         }
51         printf("%d %d %d\n",tpi,tpj,sum);
52     }
53     return 0;
54 }

这种就没什么技巧了。

转载于:https://www.cnblogs.com/xxx0624/archive/2012/05/01/2478076.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值