我想找到一个名为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;
}
编译器给了我关于潜在溢出的警告,因为maxPosibleSq
和minPosibleSq
太大了。有没有更好更快的方法呢?
答案 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位数字。