对于编程竞赛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;一些测试用例的错误。我的问题是,有没有更好的方法解决这个问题?
答案 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;
}