AcWing第 31 场周赛——01数
题目描述
如果一个正整数,其各个数位上的数字均满足要么是 0,要么是 1,则称该数字为 01数。
例如,1和 10 都是 01数。
给定一个整数 n。请你计算,1~n中有多少个 01数。
输入格式
一行,一个整数 n。
输出格式
一个整数,表示 01数的数量。
数据范围
前六个测试点满足 1≤n≤100。
所有测试点满足 1≤n≤109。
输入样例:
10
输出样例:
2
示例代码
1 import java.util.*; 2 3 public class Main { 4 5 private static int res = 0; 6 7 private static int n; 8 9 private static int[] val = new int[10]; 10 11 private static int[] visit = new int[10]; 12 13 public static void main(String[] args) { 14 Scanner input = new Scanner(System.in); 15 n = input.nextInt(); 16 int len = String.valueOf(n).length(); 17 recursion(len, 1); 18 System.out.println(res); 19 } 20 21 public static void recursion(int len, int pos) { 22 if (pos > len) { 23 int total = 0; 24 for (int i = 1; i <= len; i++) { 25 if (val[i - 1] == 1) { 26 total += Math.pow(10, len - i); 27 } 28 } 29 if (total >= 1 && total <= n) { 30 res++; 31 } 32 return; 33 } 34 35 for (int i = 0; i <= 1; i++) { 36 if (visit[pos - 1] == 0) { 37 // 标记 38 visit[pos - 1] = 1; 39 val[pos - 1] = i; 40 // 递归 41 recursion(len, pos + 1); 42 // 清除 43 visit[pos - 1] = 0; 44 } 45 } 46 } 47 }
DFS优雅实现
import java.util.*; public class Main { private static int res = 0; private static int n; public static void main(String[] args) { Scanner input = new Scanner(System.in); n = input.nextInt(); dfs(1); System.out.println(res); } public static void dfs(int val) { if (val > n) { return; } res++; // 填1 dfs(10 * val + 1); // 填0 dfs(10 * val); } }