數據結構與算法刷題筆記(No.001)——PAT1001害死人不償命的(3n+1)猜想(C/Java語言實現)

博主的數據結構刷題筆記,自己的練習記錄,供大家參考,文中所列代碼均經反覆調試或OJ系統判定通過,如仍有疏漏歡迎大家留言指正,文中算法優化不足的地方歡迎大家留言交流,感謝。

目錄

1.題目

2.輸入輸出要求

3.題目解析

3.1 輸入數據

3.2 算法處理

3.3 輸出數據

3.4 涉及到的主要知識點

3.5 Java語言實現源代碼

3.6 C語言實現源代碼

4.總結


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.總結

這麼簡單的題實在想不出來可以總結什麼了,不寫了......

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章