范围内的漂亮数字

时间:2021-03-22 08:50:49

标签: algorithm data-structures

我曾在某处被问过这个问题.. 给你 2 个整数 l 和 r ..你的任务是确定范围 r 中所有漂亮数字的总和。

满足以下条件的数是美数

<块引用> <块引用>

如果一个数字在某个时刻通过用其数字的平方和反复替换它而变成 1。 注意:如果数字永远不会变成 1,那么提供的数字不是一个漂亮的数字

示例: 例如,32 是一个快乐的数字,因为该过程产生 1 如下

3^2 + 2^2 = 13
1^2 + 3^2 = 10
1^2 + 0^2 = 1

对于范围 (31,32)...答案是 31+32 = 63 ..因为两者都是漂亮的数字。

我试图做一个这样的递归apporch:

recursivefunction(int num){
        if(num == 1) return true;  
        //Calculates the sum of squares of digits  
        while(num > 0){  
            rem = num%10;  
            sum = sum + (rem*rem);  
            num = num/10;  
      
    }  
recursivefunction(sum);
}

针对一个范围递归调用此函数并将值存储在总和中,如果其为 1 ..然后将其添加到总和变量中。

并且有问题的是没有破案,就像我没有找到 1 时我必须做的那样......所以我放了一个计数器,就像它进入递归 10 次但仍然不是 1 然后返回 false;< /p>

但问题是这个函数在某些测试用例中会超时。

2 个答案:

答案 0 :(得分:0)

您是否在检查函数是否未进入循环?您应该考虑记住(在一组中)访问过的值

你可以从这样的事情开始:

def recursivefunction(num, mySet = None):
    if mySet is None: 
        mySet = set()
    if(num == 1):
        return True
    sum_ = 0
    if num in mySet:
        return False
    mySet.add(num)
    while(num > 0):
        rem = num % 10;  
        sum_ = sum_ + (rem*rem);  
        num = (num - rem)/10;  
    return recursivefunction(sum_, mySet);

但这可以进一步优化...例如通过记住“不漂亮”的值

答案 1 :(得分:0)

然后您可以通过记住不美观的值来加快搜索速度。 这里有一个伪代码示例(python)

theNonBeautiful = set() 

def recursivefunction(num, mySet = None):
    if mySet is None: 
        mySet = set()
    if(num == 1):
        return True
    if num in theNonBeautiful:
        return False
    sum_ = 0
    if num in mySet:
        return False
    mySet.add(num)
    while(num > 0):
        rem = num % 10;  
        sum_ = sum_ + (rem*rem);  
        num = (num - rem)/10;  
    value = recursivefunction(sum_, mySet);
    if(value == False): 
        theNonBeautiful.add(sum)
    return value

竞争性编程问题为您提供范围内数字的最小、最大大小。您应该尝试进行大 O 分析,以了解此算法是否足够快以满足您的需求