📜  K重复添加N的最小除数后形成的数字(1)

📅  最后修改于: 2023-12-03 15:02:33.917000             🧑  作者: Mango

K重复添加N的最小除数后形成的数字

在这篇文章中,我们将会探讨一种有趣而又实用的编程问题:如何计算“K重复添加N的最小除数后形成的数字”。

问题描述

假设有一个数字K和一个数字N。定义操作为:将N添加到K的末尾,计算出结果并将其除以K,得到一个余数r。然后将r添加到K的末尾得到新的数字K。

比如说,对于数字K=17和数字N=5,第一次操作会将5添加到17的末尾,得到172,然后将172除以17,得到余数1,其余数将会被添加到17的末尾得到新的数字18。

我们的问题是,在这样的操作下,有没有一定条件下必然会出现一个循环。如果这是正确的,那么我们还需要找出这个循环的起始数字,并计算出循环中所有的数字。

解决方案

要解决这个问题,我们需要注意到一些特性:

  1. 在经过多次操作后,我们将会得到一个数字长度为K的数字。这个数字所能够表示的最大数字是k-1。在这个范围内,一定会有一个数字x归属于操作前的数字K。这个数字x也就是这个循环的开始。

  2. 在计算过程中,我们可以体现出循环的性质。即,如果我们已经出现过某个余数r,那么再次遇到r的时候,之后的所有数字都会形成循环。因为在之后的计算中,对于任何一个数字K,我们都可以找到已经经过的某个余数,从而计算出一个新的数字。这样不断的继续下去,观察到的数字也就不断的重复了。

基于这两个特性,我们可以考虑一个简单的算法。

我们首先定义一个集合used来储存所有出现过的余数。然后从0开始进行操作,进行如下的循环:

while (true) {
  r = (K * 10 + N) % K
  if (used.find(r) != used.end()) {
    // 找到了循环
    break;
  }
  used.insert(r);
  K = K * 10 + r;
}

在这个算法中,我们首先初始化集合used,没有出现过余数,然后我们开始执行一次操作,计算出余数r。这个余数r我们首先检查一下是否已经出现过,如果没出现过,那么我们就将r加入到used集合中,然后对数字K进行更新,使其除去原来的余数,乘以10,然后加上新的余数。

如果余数已经出现过,那么我们就说明进行过操作后已经出现了循环,退出循环。

在退出循环后,我们将会得到数字K的长度和循环的起始数字x,此时我们就可以使用这个数字x和长度来构造出所有循环中的数字。

下面是一个完整的C++实现。

#include <iostream>
#include <set>
#include <vector>

using namespace std;

void find_cycle(int K, int N, int& cycle_len, int& cycle_start, vector<int>& cycle) {
  set<int> used;
  int r;
  cycle_len = 0;
  while (true) {
    r = (K * 10 + N) % K;
    if (used.find(r) != used.end()) {
      cycle_start = *(used.find(r));
      break;
    }
    used.insert(r);
    cycle_len++;
    K = K * 10 + r;
  }

  cycle.resize(cycle_len);
  int curr = cycle_start;
  for (int i = 0; i < cycle_len; i++) {
    cycle[i] = curr;
    curr = (curr * 10 + N) % K;
  }

}

int main() {
  int K = 21;
  int N = 5;
  int cycle_len;
  int cycle_start;
  vector<int> cycle;

  find_cycle(K, N, cycle_len, cycle_start, cycle);

  cout << "Cycle length: " << cycle_len << endl;
  cout << "Cycle start: " << cycle_start << endl;
  cout << "Cycle: ";
  for (auto elem : cycle) {
    cout << elem << " ";
  }
  cout << endl;

  return 0;
}
总结

通过这篇文章,我们学习了如何解决“K重复添加N的最小除数后形成的数字”这个问题。我们发现,这个问题看起来很复杂,但实际上可以通过一些简单的算法来解决。在理解了算法的原理之后,我们可以轻松的将其实现为一个计算机程序,并应用于实际问题中。