c++ - Keprekar 数字

标签 c++ algorithm split

我正在尝试用 C++ 求解 Kaprekar 数。 该算法非常简单:

  • 取a到b的一个区间,比如1到100
  • 0 < a < b < 100000
  • 取一个变量x并赋给它元素^2
  • 你必须拆分 x,假设我们有从 10 到 100 区间的元素 45,我们将有 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(尊重 Kaprekar 规则)

我的问题是当我有像 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 始终向下舍入很重要。一旦找到合适的,就可以退出内循环。

关于c++ - Keprekar 数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611664/

相关文章:

Python 以逗号分割,不带括号

c++ - 有条件地从两个类中的任何一个继承

c++ - QT,在文件中写入新行

algorithm - 什么时候使用某种强化学习算法?

java - java 堆空间内存不足

regex - 在 Go 中使用正则表达式拆分字符串

c++ - 将指针数组传递给函数时遇到问题

c++ - 如何通过套接字发送所有数据?

使用分布式数据库构建对等搜索引擎的算法

algorithm - 如何在线性时间和(希望)次线性空间中检测稀疏数据的分区(集群)?