天天看点

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;
	}

}