負でない整数の数値を指定してください。0に変換するために必要なステップ数を返してください。現在の数値が偶数の場合は2で除算する必要があります。それ以外の場合は、1を減算します。
例1:
入力:num = 14
出力:6
説明:
ステップ1)14は偶数で、2で割ると7になります。
ステップ2)7は奇数です。1を引くと6になります。
ステップ3)6は偶数で、2で割ると3になります。
ステップ4)3は奇数です。1を引くと2になります。
ステップ5)2は偶数で、2で割ると1になります。
ステップ6)1は奇数です。1を引くと、0になります。
例2:
入力:num = 8
出力:4
説明:
ステップ1)8は偶数で、2で割ると4になります。
ステップ2)4は偶数で、2で割ると2になります。
ステップ3)2は偶数で、2で割ると1になります。
ステップ4)1は奇数です。1を引くと、0になります。
アルゴリズム1:質問の手順に従った直接実装
int NumberOfSteps1(int* arr, int num)
{
int i, count = 0;
for (i = 0;i < num;i++)
{
if (arr[i] % 2 != 0)//不能整除 次数+1
{
count += (arr[i] + 1) / 2;
}
else {
//整除
count += arr[i] / 2;
}
}
return count;
}
アルゴリズム2:すべてのビット演算子が使用されます
int NumberOfSteps2(int num)
{
int count = 0;
while(num != 0)
{
++count;
//num&1用来判断奇偶;num&0xfffffffe奇数-1;num>>1除以2
num = (num&1)!=0 ? num&0xfffffffe : num>>1;
}
return count;
}