博主的數據結構刷題筆記,自己的練習記錄,供大家參考,文中所列代碼均經反覆調試或OJ系統判定通過,如仍有疏漏歡迎大家留言指正,文中算法優化不足的地方歡迎大家留言交流,感謝。
目錄
1.題目
1001 害死人不償命的(3n+1)猜想 (15 分)
卡拉茲(Callatz)猜想:
對任何一個正整數 n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果鬧得學生們無心學業,一心只證 (3n+1),以至於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……
我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,需要多少步(砍幾下)才能得到 n=1?
2.輸入輸出要求
3.題目解析
本題不涉及任何算法,讀題後得到以下信息:
3.1 輸入數據
輸入n的範圍爲0-1000之間的正整數,這樣不用考慮輸入數據用普通數值類型存不下的問題了,這就簡單了很多很多(關於大整數的問題,可以看博主的大整數的表示及加減運算的文章:大整數的輸入處理(C語言實現))
3.2 算法處理
對輸入數據n進行處理,如果n爲偶數,則將n除以2再賦給n;如果n爲奇數,則將(3*n+1)/2再賦給n,直到n的值爲1時停止。每次奇數情況的處理或偶數情況的處理均算作一次處理,處理過程中記錄下處理的總次數,處理結束後輸出總處理次數。
3.3 輸出數據
輸出處理過程中記錄的處理次數,即輸出結果爲一個正整數。
3.4 涉及到的主要知識點
本題只涉及編程語言的基礎知識,包括變量、循環、條件判斷、輸入輸出函數等。本題沒有涉及任何的算法或數據結構。
3.5 Java語言實現源代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
sc.close();
int cnt = 0;
while(num!=1) {
if(num%2 == 0) {
num = num/2;
}
else {
num = (3*num+1)/2;
}
cnt++;
}
System.out.print(cnt);
}
}
3.6 C語言實現源代碼
#include<stdio.h>
int main(void) {
int num; //輸入數據
int cnt = 0;//記錄處理次數
scanf("%d",&num);
while(num!=1) {
if(!(num%2)) { //如果num爲偶數
num = num/2;
}
else { //否則 num即爲奇數
num = (3*num+1)/2;
}
cnt++; //處理次數自增1
}
printf("%d",cnt);
}
4.總結
這麼簡單的題實在想不出來可以總結什麼了,不寫了......