牛牛打响指--大数做除法

链接: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;
}

点赞