《平衡数》 题解

目录

题目描述
输入描述
输出描述
解析
完整代码

描述

平衡数:如果正整数 x 的每一位数字 d 恰好在 x 中出现了 d 次,则认为 x 是平衡数。例如 x=122,其中

对于百位数 d=1,其中 1 在 122 中总共出现了 1 次,符合条件;

对于十位数 d=2,其中 2 在 122 中总共出现了 2 次,符合条件;

对于个位数 d=2,其中 2 在 122 中总共出现了 2 次,符合条件;

因为 122的每一位都符合条件,所以 122是平衡数。

现在给出两个正整数l,r(l≤r),请帮忙求出l∼r中所有平衡数的和。

输入描述

输入共一行,两个以空格隔开的正整数 l,r(1≤l≤r≤10000)。

输出描述

输出共一行,一个整数,表示l∼r 中所有平衡数的和。

用例输入 1 

1 25

用例输出 1 

23

来源

http://bas.ssoier.cn:8086/problem_show.php?pid=3297 数的存储与组织

最近时间比较紧,更新属实有点慢,题解就先简单应付一下吧,愿大家原谅^_^

这题一定要理解题意,对后面有很大帮助。

根据题目,我们得知平衡数的定义为:一个数x的每个数位d在x中出现了d次。如果还是读不明白,那就可以借助题目给的例子理解。

下面是具体思路加代码:

#include <bits/stdc++.h>
using namespace std;
bool phs(int x){//计算平衡数
    int b=0;//计算位数
    int a=x;//辅助变量b
    //用while循环来提前计算它的位数
    while(a>0){
        b++;//累加
        a/=10;
    }
    int y=x,z=x;//辅助变量,以后有用
    int sum=0;//用于计算x中出现了多少次
    int cnt=0;//累计符合平衡数条件的位数
    while(x>0){
        while(y>0){
            if(x%10==y%10)sum++;//计算出现的次数
            y/=10;
        }
        if(sum==x%10)cnt++;//判断恰好在x中出现了x%10次
        x/=10;
        y=z;//注意细节,这里的y要更新
        sum=0;//注意归零
    }
    return cnt==b;//判断是否每一位都满足条件
}
int main() {
    int l,r,sum=0;
    cin>>l>>r;
    for(int i=l;i<=r;i++){
        sum+=(phs(i)==true?i:0);//三目运算符,逻辑为:如果i为平衡数,那么sum加上i,否则就加上0
    }
    cout<<sum;
 return 0;
}

结束了!

对了,忘说了一句话:

要想c++成绩好,就来jiabei小课堂

还有,点我主页,看我简介,别给那三个人点赞就完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值