- 题目要求很简单,清晰,但是看题目介绍是数位DP,实际上自己没学过,但是听课后,可以不用DP去写,可以一点一点的加,然后其中夹杂着判断,关键就是dfs这个思想,我在一个什么样的基础上面,我要怎么去做,怎么去选择,怎样会结束搜索过程,开始是什么样的,想清楚后,写就会简单多了,dfs里面三个形参,分别表示当前的数字,当前数字的末尾数字,以及当前是否有1,这样dfs就出来了。
#include<bits/stdc++.h> using namespace std; long long isprime(long long x)//判断两数之和 { if(x==1 || x==0) return 0; if (x==2 || x==3) return 1; for (long long i = 2;i*i<=x;i++) { if (x%i==0) return 0; } return 1; } long long l,r; long long ans; void dfs(long long x,long long last,long long flag)//当前数字,上一个数位数字 判断是否有1 { if (x>r)return; if (x>=l && flag) { // cout << x << " "; ans++; } long long f; for (long long i = 0;i<=9;i++) { if(i==1) f = 1; else f=0; if (isprime(i+last)) //是素数 { dfs(x*10+i,i,flag || f); } } } int main() { cin >> l >> r; // dfs(1,1,100000000); for (int i = 1;i<=9;i++)//遍历第一个数子 { dfs(i,i,i==1); } cout << ans; return 0; }
有几个关键点,一个是那个flag是否为一,该怎么确定,这里的话,用flag || f 来确定,意味只要存在一个1即可,还有就是数据范围问题,用int还是long long,个人推荐还是long long.