检查数字是否为二进制

时间:2017-08-19 11:36:23

标签: c++

对于编程竞赛question,我已经提出了这个解决方案:

#include <bits/stdc++.h>
using namespace std;

inline bool isBasedTwo(int n) {
    while (n) {
        if ((n % 10) > 1)
            return false;
        n /= 10;
    }
    return true;
}

int main() {
    int n, count(0);
    cin >> n;
    for (int i(1); i <= n; i++)
        if (isBasedTwo(i))
            ++count;
    cout << count;
    return 0;
}

输入包含一个整数&#39; n&#39;。程序必须计算1到n范围内的数字,它们只包含0和1(是二进制表示)。

例如输入&#39; 10&#39;程序必须输出2,因为1和10是范围内唯一的数字,只包括零和一位数。

但是这段代码超过时间限制&#34;一些测试用例的错误。我的问题是,有没有更好的方法解决这个问题?

2 个答案:

答案 0 :(得分:0)

可能正在使用 #!/bin/bash mkdir ../running_random for fname in *.mp3 do cp "$fname" ../running_random/$RANDOM."$fname".mp3 done 输入n帮助您解决问题,因为scanf("%d ",&n)比cin快 为了能够使用它,你必须包括工作室或cstudio库

另一件可能有效的方法是你尝试scanf()方法将n的数字作为字符,然后检查每个字符是否等于1或0,否则数字不是二进制

希望这个帮助

答案 1 :(得分:0)

您不需要数到n。您所要做的就是找到带有1和0的最大数字,当解释为十进制时,小于n。

要执行此操作,只需将输入作为字符串读取,迭代数字,然后从第一个位置看到大于1的数字,将其余部分更改为'1'

然后将字符串解释为二进制数。这基本上是只有1和0的数字,它们比它小。

#include <iostream>
#include <string>

using namespace std;

int main() {
    string n; cin >> n;
    for(int i = 0 ; i < n.size() ; i++)
        if(n[i] > '1') {
            for(int j=i ; j<n.size() ; j++)
                n[j] = '1';

            break;
        }

    cout << stoi(n, nullptr, 2) << endl;
    return 0;
}