Hexadecimal’s Numbers
题面翻译
输入n,输出1-n的自然数中各数位只包含0和1的数的个数。
Translated by @Lolierl
题目描述
One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got access to the memory of his not less mean sister Hexadecimal. He loaded there a huge amount of $ n $ different natural numbers from 1 to $ n $ to obtain total control over her energy.
But his plan failed. The reason for this was very simple: Hexadecimal didn’t perceive any information, apart from numbers written in binary format. This means that if a number in a decimal representation contained characters apart from 0 and 1, it was not stored in the memory. Now Megabyte wants to know, how many numbers were loaded successfully.
输入格式
Input data contains the only number $ n $ ( $ 1<=n<=10^{9} $ ).
输出格式
Output the only number — answer to the problem.
样例 #1
样例输入 #1
10
样例输出 #1
2
提示
For $ n $ = 10 the answer includes numbers 1 and 10.
思路
这道题如果直接枚举的话,会卡在#14,因为n的范围太大,会超时。因此我们采取dfs。我们观察这个条件,只能0和1,那么我们就dfs找出 n = 10 × x n=10\times x n=10×x和 n = 10 × x + 1 n=10\times x+1 n=10×x+1就行了。
代码
#include<iostream>
using namespace std;
const int N = 1e5+10;
int n,cnt;
void dfs(int x){
if(x>n)return;
cnt++;
dfs(x*10);
dfs(x*10+1);
}
int main(){
cin>>n;
//TLE的#14
// for(int i=1;i<=n;i++){
// bool f=false;
// // string a=to_string(i);//
// int t=i;
// while(t){
// a[ct++]=t%10;
// t/=10;
// }
// for(int j=0;j<ct;j++){
// if(a[j]!=0&&a[j]!=1){
// f=true;
// }
// }
// if(!f){
// cnt++;
// }
// ct=0;
// }
dfs(1);
//根据特性:n=k*10,n=k*10+1
cout<<cnt;
return 0;
}