完美整数| 豆包MarsCode AI 刷题

37 阅读3分钟

题目分析

由题目我们可以得知,只有有且一个数字组成的整数,才是完美整数,如果里面出现了其他不一样的就不是完美整数

问题思考

  • 如何实现该功能函数?
  • 那我们需要取出一个数的所有位数进行一一比较,如果全是一样的,则说明这个是完美整数。
  • 如果有不一样的位数,那么可以直接返回说明这个不是完美整数。但是题目要求的是从一个区间里统计出完美整数的个数,那我们直接返回的话会导致函数直接终止,那该怎么改进?
  • 如何自动化取出一个数的所有位数?

思路改进

  • 我们可以使用一个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循环
  • 整体代码逻辑比较绕,容易在处理逻辑时搞混