我正在尝试解决C++中的KAPRKKAR数。
算法非常简单:
以a到b为间隔,例如1到100
0获取变量x并将其赋给元素^2
你必须拆分x,假设元素45在区间10到100之间,我们得到45^2=2025这意味着你必须把2025分成两部分,这两部分之和等于x,这意味着你必须取20和25->20+25=45。
两个分割部分都必须是非负整数。
打印该间隔中符合上述规则的所有元素。
下面是我的c++代码:
int main() {
int a, b, pow, first = 0, second = 0;
cin >> a >> b;
for(int i = a; i < b; i++) {
pow = i*i;
first = (i*i)/10;
second = (i*i)%10;
if(i > 0 && i < 100000 && ((first + second) == i)) {
cout << i << endl;
}
}
return 0;
}
问题是这只在9:
9*9=81
8+1=9(遵守卡普雷卡尔法则)
我的问题是,当我有一个像2223这样的大数时,如何解决这个算法并以正确的方式拆分:
2223*2223=4941729
494+1729=2223
因为我用first和second求解的方法只适用于2个字符的数字。
最佳答案
结合@btilly的有益评论,您可以这样做:
int main()
{
unsigned long long a, b, pow, first = 0, second = 0;
cin >> a >> b;
for (unsigned long long i = a; i < b; i++) {
pow = i*i;
for (unsigned unsigned long long j = 1; j <= 100000 *100000 ; j = j * 10)
{
first = floor(pow / j);
second = pow % j;
if (second >0 && i > 0 && i < 100000 && ((first + second) == i))
{
cout << i << endl;
j = 100000 *100000 + 1;
}
}
}
return 0;
}
我认为重要的是要确保分区
pow/j
总是向下舍入。一旦你找到一个合适的,内环可以退出。