目录
题目描述
输入描述
输出描述
解析
完整代码
描述
平衡数:如果正整数 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小课堂。
还有,点我主页,看我简介,别给那三个人点赞就完了