第二章-在线编程题2-求解幸运数问题

问题描述:小明同学在学习了不同的进制之后用一些数字做起了游戏。小明同学知道,在日常生活中最常用的是十进制数,而在计算机中二进制数也很常用。现在对于一个数字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;
}

 

posted @ 2020-09-22 22:03  Git-Huber  阅读(509)  评论(0编辑  收藏  举报