在范围[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
}
答案 0 :(得分:1)
您提供的伪代码似乎是正确的 - 除了i
中的n
和checkPerfectSquare
之类的拼写错误。如果您的实施产生了意想不到的结果,请显示您的真实代码。
好的,让我们回顾一下您的目的:在范围[a,b]中选择具有完美数字的完美正方形。这是一个简单的想法:
a
和b
变大时,您的问题会受到效率极低的影响。请注意,方块中的所有数字总是少于一个范围内的所有数字,我们可以这样做:
[10^(n-1), 10^n-1]
范围内(所有n位数字的范围),只有大约10^(n/2) - 10^((n-1)/2)
个完美的正方形!这远远小于整个范围内的数字量,因此您的程序运行得更快。好吧,如果你同意上述想法,你可以写一个更好的程序。但是等一下,让我们这次尝试颠倒顺序。请注意,实际上只有三个完美的数字:1 4
和9
,我们可以像这样优化原始想法:
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);