5 幸运数字
题目描述
数字8、2、6、9是大多数中国人中最喜欢DFS的幸运数字。这几个数字的组合也被视为幸运数字,例如88。
小龙非常喜欢幸运数字。他认为只有满足以下条件的正整数才算是好的整数:
8、2、6、9中的每个数字至少在这个整数中出现一次,而且没有除了这四个之外的其他数字。
小龙想知道在1和N(含N)之间有多少个满足这一条件的整数。
输入
输入一个整数N。
输出
打印输出1到N(含N)之间幸运数字的总数量。
//分析:
/*
dfs搜索满足条件的数
从0开始,分别加2 6 8 9
对2 6 8 9添加判断以保证每个数至少出现一次
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll N,ans;
void Dfs(ll u,bool f2,bool f6,bool f8,bool f9) {
if(u>N)
return;
//递归出口:参数大于目标值
if(f2&&f6&&f8&&f9)
ans++;//当2 6 8 9都存在时数目+1
Dfs(u*10+2,1,f6,f8,f9);
Dfs(u*10+6,f2,1,f8,f9);
Dfs(u*10+8,f2,f6,1,f9);
Dfs(u*10+9,f2,f6,f8,1);
}
int main() {
cin>>N;
Dfs(0,0,0,0,0);
cout<<ans;
}
7 帮助小强
题目描述
小强前去面试一份工作。老板说,有个问题你如果能答上来,就能得到这份工作。可是小强怎么也答不上来,场面非常窘迫。老板说:“我不在乎你原来学了什么,我只在乎你能否快速掌握新知识。回家去再想想,如果明天能答上来,就直接来上班。”问题如下:
如果你被给予一个整数N,包含1到9的数字,你可以在这个整数的任意位置插入加号。可以在多个位置插入加号,或者一个也不插入,但是在一个位置上只能插入一个加号,不得连续插入多个加号。这样就能通过加法得到一个新的整数。请计算出按这种方法得到的所有整数的总和。
请帮助小强得到这份工作吧!
输入
输入仅包含一个整数N。
输出
打印输出按这种添加加号的方法得到的所有整数的总和。
//分析:
/*
迭乘倍数,对t取余相加到k上,继承到下一层,每层dfs都迭加t+k
对345手动模拟一下
Dfs(0,345) 0+345
i=10
Dfs(345%10,345/10)->Dfs(5,34) 5+34
i=10
Dfs(5+34%10,34/10)->Dfs(9,3) 9+3
i=100>34回溯
i=100
Dfs(345%100,345/100)->Dfs(45,3) 45+3
i=10>3回溯
i=1000>345终止 上式相加,得ans=444
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ans;
void Dfs(ll k,ll t) {
ans+=k+t;//t+k为每次加加号的和
for(ll i=10;i<=t;i*=10){
if(i<=t)
Dfs(k+t%i,t/i);
}
}
int main() {
cin>>n;
Dfs(0,n);
cout<<ans;
return 0;
}