链接:https://www.nowcoder.com/questionTerminal/442cbe24e08447729543510c2eb47082
来源:牛客网
牛牛在地上捡到了一个手套,他带上手套发现眼前出现了很多个小人,当他打一下响指,这些小人的数量就会发生以下变化:如果小人原本的数量是偶数那么数量就会变成一半,如果小人原本的数量是奇数那么数量就会加一。现在牛牛想考考你,他要打多少次响指,才能让小人的数量变成1。
输入描述:
每个输入包含一个测试用例。 输入的第一行包括一个正整数,表示一开始小人的数量N(1<=N<=10^100)。
输出描述:
对于每个用例,在单独的一行中输出牛牛需要打多少次响指才能让小人的数量变成1。
示例1
输入
10000
输出
20
#include<iostream>
#include<vector>
using namespace std;
int main()
{
unsigned int N[128] = { 0 };
char temp;
int begin = 0, end = 0, res = 0;
while (scanf("%c", &temp))
{
if (temp == '\n')
break;
N[end] = temp - '0';
end++;
}
while (!(begin == end - 1 && N[end - 1] == 1))
{
if (N[end - 1] & 1) //判断奇数还是偶数
{
N[end - 1]++;
res++;
}
int flag = 0, tempV = 0;
res++;
for (int i = begin; i < end; i++) //偶数做除
{
tempV = N[i] + flag * 10;
flag = tempV & 1; //余数,余数是1或者0
N[i] = tempV >> 1;
}
if (N[begin] == 0)begin++;
}
cout << res;
return 0;
}