[问题描述] 小明同学在学习了不同的二进制之后用一些数字做起了游戏。小明同学知道,在日常生活中最常用的是十进制数,而在计算机中二进制数也很常用,现在对于一个数字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.小明同学发现对于一些正整数x满足f(x)=g(x),他把这种数称为幸运数,现在他想知道小于等于n的幸运数有多少个?
[输入描述] 每组数据输入一个数n(n <= 100000)
[输出描述] 每组数据输出一行,小于等于n的幸运数个数。
[输入样例] 21
[样例输出] 3
[思路] 本题的关键是将十进制数转换为r进制数,并求各位数之和。设f(n,r)返回十进制数n转换为r进制数后各位数之和,对应的递归模型如下:
f(n,r) = n 当n < r时
f(n,r) = n % r + f(n / r,r) 其他情况
#include <iostream>
using namespace sts;
//问题表示
int n;
int solve(int n,int r) //求十进制数n转换为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;
}