gpt4 book ai didi

c++ - Keprekar 数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:44 27 4
gpt4 key购买 nike

我正在尝试用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com