完美的正方形,一系列内的完美数字

时间:2013-11-03 18:41:49

标签: c

在范围[a,b]之间获得完美数字的所有完美正方形的最佳方法是什么? 一个完美的数字完美正方形是所有数字完美的正方形。 我做了如下

for j=a to b
    do if(checkPerfectSquare(j) && checkPerfectDigit(j))
        then ctr++
print ctr

int checkPerfectSquare(n)
{
if n<0
    return 0
root=round(sqrt(n))
return (n==root*root)
}

int checkPerfectDigit(n)
{
while n>0
    do rem=n%10
       n=n/10
    if(!checkPerfectSquare(rem))
        return 0
return 1
}

2 个答案:

答案 0 :(得分:1)

您提供的伪代码似乎是正确的 - 除了i中的ncheckPerfectSquare之类的拼写错误。如果您的实施产生了意想不到的结果,请显示您的真实代码。

好的,让我们回顾一下您的目的:在范围[a,b]中选择具有完美数字的完美正方形。这是一个简单的想法:

  • 遍历范围[a,b]并测试每个数字。实际上这正是你所做的。这当然会给出正确的答案,但请注意,当ab变大时,您的问题会受到效率极低的影响。

请注意,方块中的所有数字总是少于一个范围内的所有数字,我们可以这样做:

  • 遍历[a,b]中的所有完美正方形,并测试它们是否由完美数字组成。怎么会这样?在[10^(n-1), 10^n-1]范围内(所有n位数字的范围),只有大约10^(n/2) - 10^((n-1)/2)个完美的正方形!这远远小于整个范围内的数字量,因此您的程序运行得更快。

好吧,如果你同意上述想法,你可以写一个更好的程序。但是等一下,让我们这次尝试颠倒顺序。请注意,实际上只有三个完美的数字:1 49,我们可以像这样优化原始想法:

  • 在[a,b]的范围内迭代由完美数字组成的所有数字(例如1111111,149149149,111444449999),并测试它们是否是完美的正方形。这显然会更快,因为10^n个数字带有n个数字,而3^n只有n个完美数字。这比上面的想法更好,因为3^n = 9^(n/2)&lt; 10^(n/2)

我暂时没有提供任何伪代码或真实代码。您可能想要了解这些想法并尝试先编写一些代码。

答案 1 :(得分:0)

你可以使用

count=((floor(sqrt(b))-ceil(sqrt(a)))+1);