我曾在某处被问过这个问题.. 给你 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>
但问题是这个函数在某些测试用例中会超时。
答案 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 分析,以了解此算法是否足够快以满足您的需求