求解幸运数问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃掉你的脑子·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值