1 solutions
-
0
小朋友们,咱们来一起解决这个平衡数的问题哈。首先呢,题目告诉我们平衡数就是正整数(x),它每一位数字(d)恰好都在(x)里出现了(d)次。比如说(122),百位的(1)在(122)里就出现了(1)次,十位和个位的(2)在(122)里都出现了(2)次,所以(122)就是平衡数。现在要我们找出(l)到(r)之间所有平衡数的和。那咱们就一步一步来,下面我会详细给你们讲讲每一步是怎么做的哦。
解题步骤
-
判断一个数是否为平衡数:
- 我们要把这个数的每一位数字都取出来,看看每个数字在这个数里出现的次数是不是和它本身一样。比如说数字(3),它在这个数里就得出现(3)次才行。
- 咱们可以用一个数组来记录每个数字出现的次数。就好像有(10)个小盒子,每个盒子代表一个数字(0 - 9),我们把这个数的每一位数字拿出来,放到对应的小盒子里,放一次就给这个小盒子里的数字加(1)。
- 然后再检查每个小盒子里的数字是不是和它代表的数字一样。如果都一样,那这个数就是平衡数啦。
-
找出(l)到(r)之间的所有平衡数并求和:
- 我们从(l)开始,一个一个数地检查,一直到(r)。
- 要是这个数是平衡数,就把它加到一个总和里。
代码示例
#include<bits/stdc++.h> using namespace std; // 判断一个数是否为平衡数 bool isBalanced(int num) { int count[10] = {0}; // 定义一个数组,用来记录每个数字出现的次数,初始都为0 int temp = num; // 把num存到temp里,这样不会改变num的值 // 把这个数的每一位数字取出来,放到对应的小盒子里 while (temp > 0) { int digit = temp % 10; // 取出最后一位数字 count[digit]++; // 对应的小盒子里的数字加1 temp /= 10; // 去掉最后一位数字 } temp = num; // 检查每个小盒子里的数字是不是和它代表的数字一样 while (temp > 0) { int digit = temp % 10; // 取出最后一位数字 if (count[digit] != digit) { // 如果不一样,就不是平衡数 return false; } temp /= 10; // 去掉最后一位数字 } return true; // 如果都一样,就是平衡数 } int main() { int l, r; cin >> l >> r; // 输入l和r int sum = 0; // 定义一个变量,用来存平衡数的总和 // 从l到r一个一个数地检查 for (int i = l; i <= r; i++) { if (isBalanced(i)) { // 如果是平衡数 sum += i; // 加到总和里 } } cout << sum << endl; // 输出总和 return 0; }代码解释
isBalanced函数:这个函数用来判断一个数是不是平衡数。count[10]数组就像那(10)个小盒子,用来记录每个数字出现的次数。while (temp > 0)这个循环把数的每一位数字取出来,放到对应的小盒子里。- 第二个
while (temp > 0)循环检查每个小盒子里的数字是不是和它代表的数字一样。
main函数:- 输入(l)和(r)。
- 用一个
for循环从(l)到(r)一个一个数地检查。 - 如果是平衡数,就加到
sum里。 - 最后输出
sum。
这样,我们就可以找出(l)到(r)之间所有平衡数的和啦。
-
- 1
Information
- ID
- 221
- Time
- 1000ms
- Memory
- 64MiB
- Difficulty
- 6
- Tags
- # Submissions
- 23
- Accepted
- 10
- Uploaded By