$题解 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;
}
posted @ 2019-08-10 13:07  Luke·Skywalker  阅读(197)  评论(0)    收藏  举报