1. 程式人生 > >21天刷題計劃之11.2—牛牛打響指(Java語言描述)

21天刷題計劃之11.2—牛牛打響指(Java語言描述)

題目描述:

牛牛在地上撿到了一個手套,他帶上手套發現眼前出現了很多個小人,當他打一下響指,這些小人的數量就會發生以下變化:如果小人原本的數量是偶數那麼數量就會變成一半,如果小人原本的數量是奇數那麼數量就會加一。現在牛牛想考考你,他要打多少次響指,才能讓小人的數量變成1。

輸入描述:

每個輸入包含一個測試用例。 輸入的第一行包括一個正整數,表示一開始小人的數量N(1<=N<=10^100)。

輸出描述:

對於每個用例,在單獨的一行中輸出牛牛需要打多少次響指才能讓小人的數量變成1。

示例1

輸入
10000

輸出
20

分析:

本體的資料輸入範圍比較大,使用int 或者long型都會記憶體溢位,所以本體涉及到一種針對大數運算的物件BigInteger,其餘思想和正常運算均相同。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		while(scan.hasNext()){
			String str = scan.next();
			BigInteger num = new BigInteger(str);
			System.out.println(getTimes(num));
		}
		scan.close();
	}

	public static int getTimes(BigInteger num) {
		
		int count = 0;//計數器
		BigInteger one = new BigInteger("1");
		BigInteger two = new BigInteger("2");
		while(!num.equals(one)){
			if(num.mod(two).equals(one)){//模2判斷是否為奇數。
				num = num.add(one);
			}else{
				num = num.divide(two);//除運算。
			}
			count++;
		}
		return count;
	}

}