$题解 CF9C 【Hexadecimal's Numbers】$
[$ CF9C \ Hexadecimal's \ Numbers\(](https://www.luogu.org/problem/CF9C)
一道**~~普及-~~**的题目,不是很难,讲快点\)(QAQ)$
本题解主要思路:\(dfs\)(\(dfs\)大法好!)
因为题目要求输出\(1-n\)的自然数中各数位只包含\(0\)和\(1\)的数的个数,我们知道,符合各数位只包含\(0\)和\(1\)的最小数是几?当然是\(1\)啦,这不是明摆着的吗。所以,我们的dfs就应该从\(1\)开始搜索。
我们还可以想到,由于自然数中各数位只包含\(0\)和\(1\),所以,我们可以这样来递归调用下一层。
dfs(cur*10+1);
dfs(cur*10);
dfs(1) //在int main()中
这样的递归调用是一定正确的,为什么呢?一起来看,举一个简单的例子,当\(cur==1\)时,将会调用dfs(11)和dfs(10),而这两个数都是符合题意的,依此类推,每一层的调用自然是正确的了。
那递归调用的边界是什么呢?当热是if(cur>n) return;如果\(cur\)都\(>n\)了,那递归还有什么意义呢,所以当然要\(return\).而其他的情况只要计数器\(ans++\)就可以了。
给出部分代码:
void dfs(int cur)
{
if(cur>n) return; //递归边界,return
else ++ans; //计数器++
dfs(cur*10+1); //递归调用
dfs(cur*10); //继续递归调用
}
本文章大致内容\(OK\)了。接下来给出完整代码\(↓↓↓\)
#include<bits/stdc++.h>
using namespace std;
int n,ans;
inline int read() //我喜欢快读
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void dfs(int cur)
{
if(cur>n) return;
else ++ans;
dfs(cur*10+1);
dfs(cur*10);
}
int main()
{
n=read();
dfs(1);
printf("%d",ans); //输出ans的值
return 0;
}
退役……

浙公网安备 33010602011771号