2013-11-03 94 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);