当前位置: 代码迷 >> 综合 >> 第二章-在线编程题2-求解幸运数问题
  详细解决方案

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

热度:94   发布时间:2024-02-21 13:21:24.0

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

 

  相关解决方案