杭电OJ(HDOJ)1032题:The 3n + 1 problem(穷举,水题)

题意:

有这样一种算法:

1. input n

2. print n

3 .if n==1 then STOP

4.  if n is odd n<-3*n+1

5.  else n-<n/2

6.GOTO 2

如果输入22,则有这样一种序列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1,长度为16,输入i和j,输出[i,j]之间的数字计算所得出的序列长度最长的序列长度。要求按输入时i,j的顺序输出i,j和最长的序列长度。

示例输入:

1 10

100 200

201 210

900 1000

示例输出:

1 10 20

100 200 125

201 210 89

900 1000 174

解决方案:

题目并不难,只要把英文看懂了就可以了,但因为粗心,犯了许多的错误,浪费的好多时间,太浪费了,好可惜,还是写下以后好注意这点小毛病。

#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[1000000];
int Counter(int n)
{
    int cnt=1;
    while(n!=1)
    {
        n&1?n=3*n+1:n/=2;//用位与运算判断奇偶好方便
        cnt++;
    }
    return cnt;
}
int main()
{
    int i,j,k,max,min;
    while(scanf("%d%d",&i,&j)!=EOF)
    {
        i>j?(max=i,min=j):(max=j,min=i);//注意括号一定要加
        for(k=0;k<=max-min;k++)
            arr[k]=Counter(k+min);
        sort(arr,arr+k);
        printf("%d %d %d\n",i,j,arr[max-min]);
    }
}


你可能感兴趣的:(Algorithm,算法,ACM,杭电,OJ)