问题描述:
小明同学在学习了不同的进制之后用一些数字做起了游戏。小明同学知道,在日常生活中最常用的是十进制数,而在计算机中二进制数也很常用。现在对于一个数字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的幸运数个数。
解题方法:
using namespace std
;
int num
=1;
int func1
(int n
){//递归计算十进制数各位数求和
if(n
==0) return 0;
else
return n
%10 + func1
(n
/10);
}
int func2
(int n
){//递归算二进制数各位数求和
if(n
==0) return 0;
else
return n
%2 + func2
(n
/2);
}
int is_lucky_number
(int n
){//递归判断是否是幸运数字
if(n
==1) return num
;
else {
if(func1
(n
) == func2
(n
)) num
++;
return is_lucky_number
(n
-1);
}
}
int main
()
{
int n
, x
;
cin
>> n
;
cout
<< is_lucky_number
(n
);
system
("pause");
}