杭電OJ(HDOJ)1032題:The 3 n+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-6.GOTO 2
22が入力された場合、22 11 34 17 52 26 13 40 20 10 5 16 8 4 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
ソリューション:
問題は難しくなく、英語を読めばいいのですが、不注意で多くの間違いを犯し、多くの時間を浪費して、もったいないです.残念ですが、書いてから注意してください.
次のようなアルゴリズムがあります.
1. input n
2. print n
3 .if n==1 then STOP
4. if n is odd n<-3*n+1
5. else n-
22が入力された場合、22 11 34 17 52 26 13 40 20 10 5 16 8 4 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
",i,j,arr[max-min]);
}
}