pat 乙级 1001 害死人不偿命的(3n+1)猜想(C++)
生活随笔
收集整理的這篇文章主要介紹了
pat 乙级 1001 害死人不偿命的(3n+1)猜想(C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
卡拉茲(Callatz)猜想: 對任何一個正整數 n,如果它是偶數,那么把它砍掉一半;如果它是奇數,那么把 (3n+1)
砍掉一半。這樣一直反復砍下去,最后一定在某一步得到 n=1。卡拉茲在 1950
年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果鬧得學生們無心學業,一心只證
(3n+1),以至于有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……
我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,需要多少步(砍幾下)才能得到 n=1?
輸入與輸出
輸入格式:
每個測試輸入包含 1 個測試用例,即給出正整數 n 的值。
輸出格式:
輸出從 n 計算到 1 需要的步數。
輸入樣例:
3
輸出樣例:
5
分析
n為偶數,砍掉一半;n為奇數,(3n+1)砍掉一半;直到n=1.
很明顯,這是一個遞歸問題。
AC代碼
#include <iostream> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int fun(int n) {//偶數 int count=0;if(n%2==0&&n!=1)//n為偶數且n不為1{n=n/2;count++;if(n==1)//n為1,返回結果{return count;}else//n不為1,遞歸調用自身{return count+fun(n);}} //奇數else{count++;n=(3*n+1)/2;return count+fun(n);} } int main(int argc, char** argv) {int n,x;cin>>n;if(n==1) {}else {x=fun(n);}cout<<x<<endl;return 0; }有任何問題或者建議。歡迎評論區留言
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的pat 乙级 1001 害死人不偿命的(3n+1)猜想(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星电子DRAM市场份额创近9年新低 但
- 下一篇: pat 乙级 1002 写出这个数(C+