我正在尝试解决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总是向下舍入。一旦你找到一个合适的,内环可以退出。

09-06 16:53