题目描述:
牛牛在地上捡到了一个手套,他带上手套发现眼前出现了很多个小人,当他打一下响指,这些小人的数量就会发生以下变化:如果小人原本的数量是偶数那么数量就会变成一半,如果小人原本的数量是奇数那么数量就会加一。现在牛牛想考考你,他要打多少次响指,才能让小人的数量变成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;
}
}