找到一个整数,其平方值具有特定模式

时间:2016-02-20 07:04:39

标签: c++

我想找到一个名为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太大了。有没有更好更快的方法呢?

1 个答案:

答案 0 :(得分: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位数字。