1. 程式人生 > >17.4.8.3n+1猜想、考拉茲猜想

17.4.8.3n+1猜想、考拉茲猜想

瞭解 3n+1 猜想

Problem E: 六隊-Guess the maximum and minimum
Description
​ Utopian發現了一個很有趣的數字遊戲。

任意給定一個自然數n,按照下列規則進行變換:
如果n為偶數,n = n/2
如果n為奇數,n = 3*n+1
試猜測在變換過程中最大的n與最小的n? 並試求出從給定的n到最小的n的最少變換次數?
Input
包含多組資料。

每組資料給定一個任意的n,保證 int 型別

Output
輸出三個數max,min,times。分別表示最大值,最小值,最少變換次數

Sample Input
3
9
27
Sample Output
16 1 7
52 1 19
9232 1 111
HINT
資料組數在10萬左右

暫無測試資料
分析:
這裡寫圖片描述

考拉茲猜想(英語:Collatz conjecture),又稱為奇偶歸一猜想、3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、烏拉姆猜想或敘拉古猜想,是指對於每一個正整數,如果它是奇數,則對它乘3再加1,如果它是偶數,則對它除以2,如此迴圈,最終都能夠得到1。

計算的話,先套一個while把偶數處理了 再巢狀while處理數字直到為1

#include<iostream>
#include<cstdio>
#define LL long long
#define Max(a,b) (((a)>(b))?(a):(b))
using namespace std;
int main()
{
    LL n,maxn,ti;
while(scanf("%lld",&n)!=EOF) { maxn=n;ti=0; while(n%2==0) n=n>>1,ti++; while(n!=1) { n=3*n+1; maxn=Max(maxn,n); ti++; while(n%2==0) n=n>>1,ti++; } if(maxn<4) maxn=4; printf("%lld 1 %lld\n",maxn,ti);
} return 0; } /************************************************************** Problem: 1732 User: zjut_22 Language: C++ Result: Accepted Time:224 ms Memory:1672 kb ****************************************************************/