Smarandache-Wellin 序列


这个问题包括打印 Smarandache-Wellin 序列的前 m 项,其中 m 是任何正整数。我们将看到用 C++ 打印 Smarandache-Wellin 序列前 m 项的算法。但在那之前,我们必须了解 Smarandache-Wellin 序列。

一个Smarandache-Wellin 序列是由 Smarandache-Wellin 数构成的序列。Smarandache-Wellin 数是由连续素数连接而成的整数。前几个素数是 2, 3, 5, 7, 11, 13, 17, 19, 23……

  • 该序列的第一个 Smarandache-Wellin 数是 2。

  • 该序列的第二个数字是 23,它是前两个连续素数连接而成的。

  • 该序列的第三个数字是 235,可以说它是前三个连续素数连接而成的。

同样,我们可以得出结论,Smarandache-Wellin 序列的第 m 项就是前 m 个连续素数的连接。假设我们想要第 6 个 Smarandache-Wellin 数,那么它将是前 6 个连续数字的连接,即 23571113。

在上述问题中,我们将得到一个正整数 N,我们的任务是打印 Smarandache-Wellin 序列的前 N 个 Smarandache-Wellin 数。例如:

输入:N=4

输出: 2 23 235 2357

解释:这些是由前 4 个连续素数分别构成的 Smarandache-Wellin 序列的前四个数字。

输入:N=7

输出: 2 23 235 2357 235711 23571113 2357111317

解释:Smarandache-Wellin 序列的每一项都是前 i 个连续素数的连接,其中 i 大于等于 1 且小于等于 7。

算法

这种方法可能和看起来一样简单。我们知道 Smarandache-Wellin 序列的第 N 项是前 N 个连续素数的连接。

因此,找出前 N 个连续素数,通过进一步连接每项的 i 个连续素数,就可以得到 Smarandache-Wellin 序列的前 N 个 Smarandache-Wellin 数。我们可以按照以下步骤找出前 N 个素数:

  • 为了存储素数的数量以获得前 N 个连续素数,我们将创建一个变量。

  • 使用循环检查数字是否是素数,直到计数等于 N 以获得前 N 个素数。如果它是素数,我们将把素数计数增加 1。

  • 为了确定一个数字是否是素数,我们将迭代一个 for 循环,从 i=2 开始,直到该数字小于或等于其平方根。如果该数字能被任何其他数字整除,则它不是素数,因为素数只有两个因子,即该数字本身和 1。

  • 根据数学原理,合数总是至少包含一个小于该数字平方根的因子。正因为如此,为了确定一个数字是否是素数,我们只需迭代到该数字的平方根。

通过这种方式,迭代直到素数计数等于 N,并检查从 2 开始的每个数字,我们可以得到前 N 个连续素数并将它们存储在数组中。

问题的下一个任务,即打印 Smarandache-Wellin 序列的前 N 项,非常简单。我们可以使用嵌套循环并在我们存储前 N 个连续素数的数组上进行迭代来实现这一点。我们将迭代一个从 0 到数组大小的循环,然后在另一个嵌套循环中从 0 到 i,打印所有直到 i 的素数,通过这种方式,我们可以实现每项前 i 个连续素数的连接。

方法

我们可以使用以下步骤获得所需输出:

  • 编写一个函数来检查数字是否是素数。

  • 编写另一个函数,我们将前 N 个素数存储在一个数组中,并使用该数组连接前 j 个连续素数以获得第 j 项。

  • 声明一个名为 count 的变量来计算素数的个数。直到 count 等于 N,检查从 2 开始的每个数字是否是素数。如果它是素数,则将其存储在我们创建的数组中。

  • 为了连接每一项所需的前几个素数,我们将使用嵌套 for 循环。这就是我们如何打印 Smarandache-Wellin 序列的前 N 项。

示例

使用上述算法解决问题的 C++ 代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

//function to check if the number is a prime number or not
bool check(int N){
   for(int i= 2; i <=sqrt(N); i++){ //iterating to check if the number has any divisor other than 1 and number itself
      if(N % i == 0){ //if it has return false since it is not a prime number
         return false;
      }
   }
   return true; //return true if it satisfies all the conditions
}

//function to print first N terms of Smarandache-Wellin sequence
//using an array to store first N consecutive prime numbers
void ans(int N){
   int ans[N];
   int count=0; //to count number of prime numbers
   for(int i=2;count<N;i++){ //for storing first N consecutive prime numbers in the array
      if(check(i)){
         ans[count]=i; //if the number is prime store it in the array
         count++; //increase count
      } else {
         continue;
      }
   }
   cout<<"The first "<<N<<" terms of Smarandache-Wellin sequence are: ";
   for(int i=0;i<N;i++){ //for printing first N terms of Smarandache-Wellin sequence
      for(int a=0;a<=i;a++){ //for concatenating first a prime numbers for ath term
         cout<<ans[a];
      }
      cout<<" ";
   }
   cout<<endl;
}
int main(){
   int N=6;
   ans(N);
   N=12;
   ans(N);
   return 0;
}

输出

The first 6 terms of Smarandache-Wellin sequence are: 2 23 235 2357 235711 23571113
The first 12 terms of Smarandache-Wellin sequence are: 2 23 235 2357 235711 23571113 2357111317 235711131719 23571113171923 2357111317192329 235711131719232931 23571113171923293137

时间复杂度:O(N*logN),因为我们正在检查从 2 到 N 的每个数字是否是素数。

空间复杂度:O(N),因为我们使用了大小为 N 的数组。

结论

在本文中,我们学习了 Smarandache-Wellin 序列及其背后的概念。我们还使用有效的算法了解了如何在 C++ 中打印 Smarandache-Wellin 序列的前 N 项。

我希望本文能帮助您理解所有关于这个问题的概念。

更新于:2023年3月16日

275 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告