问题描述:小明同学在学习了不同的进制之后用一些数字做起了游戏。小明同学知道,在日常生活中最常用的是十进制数,而在计算机中二进制数也很常用。现在对于一个数字x,小明同学定义出两个函数f(x)和g(x),f(x)表示把x这个数用十进制写出后各数位上的数字之和,例如f(123)=1+2十3=6;g(x)表示把x这个数用二进制写出后各数位上的数字之和,例如123的二进制表示为1111011,那么g(123)=1+1+1+1+0+1+1=6。小明同学发现对于一些正整数α满足f(z)=g(z),他把这种数称为幸运数,现在他想知道,小于等于n的幸运数有多少个?
输入描述:每组数据输入一个数n(n<100 000)。
输出描述:每组数据输出一行,小于等于n的幸运数个数。
输入样例: 21
输出样例:3
算法思想:这道题我在刚开始做的时候,设计了两个递归函数来分别求各位数与各二进制位数。但仔细思考会发现,求解每一个位数和求解每一个二进制位数,分别是对10取模和对2取模。所以只需要设计一个能取不同模数的递归程序即可实现。
代码如下:
#include <iostream> using namespace std; int n; int solve(int n, int r) { int res = 0; if (n < r) return n; return n % r + solve(n / r, r); } int main() { cin >> n; int ans = 0; for (int i = 1; i <= n; i++) if (solve(i, 10) == solve(i, 2)) ans++; cout << ans << endl; return 0; }