2016-02-20 38 views
2

我想找到一個稱爲result的整數,其平方值(result^2)的模式爲1_2_3_4_5_6_7_8_9_0(_爲數字)。我的做法是,找到這樣的模式所有數字和其平方根爲整數找到數:找到一個整數,其平方值有一定的模式

#include <cmath> 
#include <string> 

using std::string; 

int main(){ 

    std::string candidate; 

    long result; 

    long maxPosibleSq = 1929394959697989990; 
    long minPosibleSq = 1020304050607080900; 


    for (long i=minPosibleSq; i<=maxPosibleSq; i+=10 /*last digit is always 0*/){ 
     if (sqrt(i)==floor(sqrt(i))){ 
      candidate = std::to_string(i); 
      if (candidate[2]=='2' && candidate[4]=='3' && candidate[6]=='4' && candidate[8]=='5' && candidate[10]=='6' 
      && candidate[12]=='7' && candidate[14]=='8' && candidate[16]=='9'){ 
       result=std::stol(candidate); 
       break; 
      } 
     } 
    } 

    return 0; 
} 

編譯器給我的警告潛在的溢出,因爲maxPosibleSqminPosibleSq太大。有沒有更好更快的方法來做到這一點?

+2

作爲一般主題領域,如果您正在做這類事情,請參閱[任意精度算術](https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic)。或者看到關於[100位數字的平方根](http://stackoverflow.com/a/15998678)的答案。 – HostileFork

+0

我聽不懂。這些數字應該是唯一的: 1323334353637383930或1727374757677787970 而不是1122334455667788990 ??? – Coding4Fun

+0

@AmermaneBOUACHRI所有提到的都可能成爲候選人 –

回答

2

另一種方法是遍歷可能是1_2_3_4_5_6_7_8_9_0的平方根的一系列整數。範圍介於sqrt(10203040506070809)sqrt(19293949596979899)之間。有大約3.8億這樣的數字。對於每個數字,計算它的平方根,看它是否適合該模式

更好的是,您可以逐步通過此範圍,步驟爲10,因爲您的答案的最後一位必須爲零,因爲它的方形結束與零。因此,你只有大約3800萬個號碼需要通過。

爲了避免溢出錯誤,使用unsigned long long,它會給你64位整數。你可以代表的最大數字是18446744073709551615,它有20位數字。

+0

我們知道答案必須是9位數。從1開始,以0結束。因此,我們只需要380萬個數字即可 – invisal

相關問題