题目分析
由题目我们可以得知,只有有且一个数字组成的整数,才是完美整数,如果里面出现了其他不一样的就不是完美整数
问题思考
- 如何实现该功能函数?
- 那我们需要取出一个数的所有位数进行一一比较,如果全是一样的,则说明这个是完美整数。
- 如果有不一样的位数,那么可以直接返回说明这个不是完美整数。但是题目要求的是从一个区间里统计出完美整数的个数,那我们直接返回的话会导致函数直接终止,那该怎么改进?
- 如何自动化取出一个数的所有位数?
思路改进
- 我们可以使用一个for循环,循环区间里的所有数,如果判断这个数为完美整数,我们可以创建一个变量用来进行计数
- 可以使用while循环依次取出进行判断
代码编写思路
下面我们用C++作为例子进行编写 首先我们先为计数器变量c进行初始化(如果不初始化容易造成其他问题),然后遍历形参X,Y循环,由于个位数直接是完美整数,所以如果数是单位则直接是完美整数
for (long long i = x; x <= y; x++) {
if (x >= 1 && x < 10){
c++;
}
下面我们定义一个新变量num,sum分别用来接收初始化取余(后面的数取余一定等于这个数),以及每次都除10后的位数(每个数取10余一定获得是尾数),然后设定while条件是大于0才进行,在while循环里面新建qum变量用于接收每次更新后的取余位数的数值,在里面进行判断是否每次取余都相同,如果相同则一直循环到遍历到最后一位,然后对变量c进行计数,如果有一位数,不相同,则直接跳出循环,进行下一个数的判断
int sum = x/10;
while (sum > 0) {
int qum = sum % 10;
sum = sum / 10;
if (num == qum) {
if (sum == 0) {
c++;
}
}
else
{
break;
}
}
}
最后是直接返回计数器的数值c 完整的C++代码如下:
#include <vector>
int solution(int x, int y) {
// Edit your code here
int c = 0;
for (long long i = x; x <= y; x++) {
if (x >= 1 && x < 10){
c++;
}
int num = x % 10; //取余数,如是完美整数,则每位的余数相同
int sum = x/10;//初始化原始数值
while (sum > 0) { //需要是两位数及以上,循环才会进行
int qum = sum % 10;
sum = sum / 10;//如果是个位数/10后将会等于0,个位数则将会结束下次循环 1 0
if (num == qum) {
if (sum == 0) {
c++;
}
}
else
{
break;
}
}
}
return c;
}
int main() {
// Add your test cases here
std::cout << (solution(1, 10) == 9) << std::endl;
std::cout << (solution(2, 22) == 10) << std::endl;
return 0;
}
难点分析
- 在进行比较时,需要先定义一个变量接收初始化取余以及初始化/10再进入while循环
- 整体代码逻辑比较绕,容易在处理逻辑时搞混