【问题标题】:Number of steps to reduce a number in binary representation to 1将二进制表示中的数字减少到 1 的步骤数
【发布时间】:2022-08-17 23:21:29
【问题描述】:

给定整数的二进制表示为字符串 s,根据以下规则返回将其减少到 1 的步数:

如果当前数字是偶数,则必须将其除以 2。

如果当前数字是奇数,则必须将其加 1。

保证您始终可以为所有测试用例找到一个。

示例 1

输入:

s = \"1101\"

输出:

6

解释:

\"1101\" 对应十进制表示的数字 13。

步骤 1) 13 是奇数,加 1 得到 14。

步骤 2) 14 是偶数,除以 2 得到 7。

步骤 3) 7 是奇数,加 1 得到 8。

步骤 4) 8 是偶数,除以 2 得到 4。

步骤 5) 4 是偶数,除以 2 得到 2。

步骤 6) 2 是偶数,除以 2 得到 1。

#include <iostream>
#include <string.h>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s = \"1111011110000011100000110001011011110010111001010111110001\";
    long int count = 0, size;
    unsigned long long int dec = 0;
    size = s.size();
    // cout << s[size - 1] << endl;
    for (int i = 0; i < size; i++)
    {
       // cout << pow(2, size - i - 1) << endl;
        if (s[i] == \'0\')
            continue;
        // cout<<int(s[i])-48<<endl;
        dec += (int(s[i]) - 48) * pow(2, size - 1 - i);
    }
    // cout << dec << endl;
    //  dec = 278675673186014705;

    while (dec != 1)
    {

        if (dec % 2 == 0)
            dec /= 2;
        else
            dec += 1;
        count += 1;
    }

    cout << count;
    return 0;
}

对于上面的输入输出应该是 85。但我的输出显示 81。对于其他测试用例它 似乎给出了正确的答案。我一直在尝试所有可能的调试,但我被卡住了。请帮帮我。

  • 你有一个计划,你编写了代码来遵循这个计划。如果代码不起作用,请use the debugger 查看代码与您的计划有什么不同。然后,您要么更改代码以使代码正确遵循您的计划,要么重新开始一个新计划。 --我一直在尝试所有可能的调试-- 不,程序员永远不应该处于他们自己编写代码的位置,他们不知道代码有什么问题。
  • #include &lt;bits/stdc++.h&gt; 不是 C++。不要那样做。
  • @Eljay 看起来这是一个有竞争力的程序员。
  • @RyanZhang 即使是一次性代码也是一个糟糕的习惯。
  • 我们不关心&lt;bits/stdc++.h&gt; 带来的编译开销我在乎,因为我无法编译代码,因为我没有bits/stdc++.h

标签: c++


【解决方案1】:

这一行:

pow(2, size - 1 - i)

可以像pow takes and returns doubles 一样面对精度错误。

幸运的是,对于不会溢出unsigned long longs 的以 2 为底的幂,我们可以简单地使用位移位(相当于pow(2, x))。

将该行替换为:

1LL<<(size - 1 - i)

所以它应该看起来像这样:

dec += (int(s[i]) - 48) * 1ULL<<(size - 1 - i);

我们将得到85 的正确输出。

注意:正如@RSahu 所提到的,您可以删除(int(s[i]) - 48),因为int(s[i]) == '0' 已经被上述if 语句捕获。只需将行更改为:

dec += 1ULL<<(size - 1 - i);

【讨论】:

  • (int(s[i]) - 48) * 是不必要的。预计只有1。不?
  • @RSahu s[i] 可以是 '0'。如OP给出的示例所示。
  • 这已经通过if (s[i] == '0') continue; 检查处理了。
  • @RSahu 对。好的。我会将其编辑为我的答案(因为它没有引起问题,所以我没有考虑它)。
  • @Eljay它不会影响答案。但可以肯定的是,我会改变它。
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2013-05-07
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多