笔试题--求幸运数个数

题目要求找到小于等于给定数n的幸运数个数,幸运数是满足十进制和二进制位数字之和相等的数。原暴力算法因重复运算导致超时,解决方案是预计算所有1到100000的幸运数个数,并存储在数组中,后续查询直接查表,提高了效率。给出的样例输入输出包括1、5、21,对应的幸运数个数分别为1、1、3。
摘要由CSDN通过智能技术生成

题目描述:
定义一个函数f(x)表示x这个数用十进制写出各个数位的数字之和,比如:f(123) = 1 + 2 + 3 = 6;定义一个函数g(x)表示这个数用二进制写出各个位数上的数字之和,比如:123用二进制表示为1111011,那么g(1111011) = 1 + 1 + 1 + 1 + 0 + 1 + 1 = 6。若有一个数x有f(x) = g(x),则说明这个数是幸运数。若给定一个范围n,求小于等于n的幸运数有多少个。
输入:第一行一个整数T(T<=10000)表示数据组数,每组数据输入一个数n(n <= 100000)。
输出:每组数据输出一行,小于等于n的幸运数个数。
样例输入:
3
1
5
21
样例输出:
1
1
3
我写的程序如下:

#include <iostream>

using namespace std;

int f(int n)
{
    int sum = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值