2013-11-03 55 views
0

在范围[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 
} 
+1

这是有趣的伪代码,但你真正想实现这一点?如果是的话,你的问题是什么?另外,如果你正在使用'int',那么你不需要四舍五入。 – UnholySheep

+0

你有一些问题......在'checkPerfectSquare()'中,你有'i'作为参数,但在检查它之后,你使用'n'而不是'i'。在'checkPerfectDigit()'中,根本不使用参数'j'。你不应该写C假定'i'和'j'是'int';这在C89标准制定之前是陈旧的。 –

+0

我也相信在'checkPerfectDigit'中有一个无限循环,因为n永远不会被改变? – UnholySheep

回答

1

您提供的伪代码似乎是正确的 - 除了像在checkPerfectSquarein错别字。如果您的实施产生意想不到的结果,请显示您的真实代码。

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

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

注意到有是不是在一个范围内的所有数字方块总是少了,我们可以这样做:

  • 要通过内部的所有完全平方迭代[A,B],并测试它们是否是由完美的数字。这将如何?在[10^(n-1), 10^n-1](所有n位数字的范围)范围内,仅有大约10^(n/2) - 10^((n-1)/2)完美的正方形!这比整个范围内的数量要小得多,因此你的程序运行得更快。

好吧,如果你同意上面的想法,你可以写一个更好的方案。但是等一下,我们这次尝试颠倒订单。请注意,实际上是有只有三个完美的位数:1 49,我们可以优化原来的想法是这样的:

  • 要通过由内完美的位数(例如:1111111,149149149,111144449999)的所有号码重复[a,b]的范围,并测试它们是否是完美的正方形。这显然会跑得更快,因为有10^n的数字有n位数字,而只有3^n有n个完美的数字。这将是比上面的想法,因为3^n更好= 9^(n/2) < 10^(n/2)

我不是现在在这里提供任何伪或实际的代码。您可能想要了解这些想法,并尝试先编写一些代码。

+0

现在,我想这样的 对于j =开方(a)至SQRT(B) 做,如果(j * J>时= A) 如果(checkPerfectDigit(j * j)的 { 如果(checkPerfect(j * j)条) CTR ++;} }在ranges.But的平方根之间的这种方法循环搜索 现在在线编译器显示错误的答案,但我发现了测试用例的正确答案。 –

0

可以使用

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