找到第n个幸运数

找到第n个幸运数

幸运数 – 它是 m > 1 的最小整数,对于给定的正整数 n,pn# + m 是素数,其中 pn# 是第一个 n 的乘积质数。

例如,要计算第三个幸运数字,首先计算前 3 个素数 (2, 3, 5) 的乘积,即 30。加 2 后得到 32,这是偶数,加 3 得到 33,是 3 的倍数。同样可以排除 6 以内的整数。加上 7 得到 37,这是一个素数。因此,7是第三个幸运数字。

第一个原初数的幸运数字是 –

3, 5, 7, 13, 23, 17, 19, 23, 37, 61, 67, 61, 71, 47, 107, 59, 61, 109 ….

问题陈述

给定一个数字n。找到第 n 个幸运数字。

示例 1

Input: n = 3
Output: 7

解释 – 前 3 个价格数字的乘积 –

2  3  5 = 3030 + 7 = 37, a prime number.

示例 2

Input: n = 7
Output: 19

解释 – 前 7 个素数的乘积 –

2  3  5  7  11  13  17 = 510510510510 + 19 = 510529, a prime number.

方法一:原始方法

解决该问题的一个简单方法是首先计算 pn#,即前 n 个素数的乘积,然后找到 pn# 与下一个素数之间的差。获得的差额将是一个幸运的数字。

伪代码

procedure prime (num)   if num <= 1      ans = TRUE   end if   for i = 2 to sqrt(num)      if i is a factor of num         ans = false      end if   ans = trueend procedureprocedure nthFortunate (n)   prod = 1   count = 0   for i = 2 to count < n      if i is prime         prod = prod * i         count = count + 1      end if   nextPrime = prod + 2   while nextPrime is not prime      nextPrime = next Prime + 1   ans = nextPrime - prodend procedure

示例:C++ 实现

在下面的程序中,通过计算前n个素数的本初以及找到本初后的下一个素数来计算幸运数。幸运数是下一个素数与本初数之间的差。

#include using namespace std;// Function to find if a number is prime or notbool prime(unsigned long long int num){   if (num <= 1)      return true;   for (int i = 2; i <= sqrt(num); i++){      if (num % i == 0)         return false;   }   return true;}// Function to find the nth Fortunate numberunsigned long long int nthFortunate(int n){   long long int prod = 1, count = 0;      // Calculating product/primorial of first n prime numbers   for (int i = 2; count < n; i++){      if (prime(i)){         prod *= i;         count++;      }   }      // Find the next prime greater than the product of n prime numbers   unsigned long long int nextPrime = prod + 2;   while (!prime(nextPrime)){      nextPrime++;   }      // Fortunate number is the difference between prime and primorial   unsigned long long int ans = nextPrime - prod;   return ans;}int main(){   int n = 15;   cout << n << "th Fortunate number : " << nthFortunate(n);   return 0;}

输出

15th Fortunate number : 107

时间复杂度 – O(nsqrt(n)),其中 prime() 函数的复杂度为 O(sqrt(n)),nthFortunate() 中的 for 循环的复杂度为 O(nsqrt(n))。

空间复杂度 – O(1)

方法 2:埃拉托斯特尼筛法

埃拉托色尼筛用于将所有质数达到一个极限,我们将给出一个值 MAX。在这种方法中,我们创建一个包含所有 true 条目的布尔数组,并将所有非素数索引标记为 false。然后将数组中的前 n 个素数相乘,得到前 n 个素数的乘积。然后与之前的方法类似,从 2 开始将乘积加 1,以获得下一个素数。下一个素数与乘积之差就是所需的幸运数。

伪代码

procedure nthFortunate (n)   MAX is set   prime[MAX] = {true}   prime[0] = false   prime[1] = false   for i = 1 to i*i <= MAX      if prime[i]         for j = i*i to MAX with j = j + i in each iteration            prime [j] = false      end if   prod = 1   count = 0   for i = 2 to count < n      if prime[i]         prod = prod * i         count = count + 1      end if   nextPrime = prod + 2   while nextPrime is not prime      nextPrime = nextPrime + 1   ans = nextPrime - prodend procedure

示例:C++ 实现

在下面的程序中,大小为 MAX 的布尔素数数组记录了 MAX 之前的所有素数。然后通过将前 n 个素数相乘来找到原初。然后与之前的方法类似,找到nextPrime。 nextPrime 和 Product 的区别在于幸运数字。

#include using namespace std;// Function to find the nth Fortunate numberunsigned long long int nthFortunate(int n){   // Setting upper limit for Sieve of Eratosthenes   const unsigned long long int MAX = 1000000000;   vector prime(MAX, true);   prime[0] = prime[1] = false;      // Sieve of Eratosthenes to find all primes up to MAX   for (unsigned long long int i = 2; i * i <= MAX; i++){      if (prime[i]){               // Setting all the multiples of i to false         for (int j = i * i; j <= MAX; j += i){            prime[j] = false;         }      }   }      // Find the first n primes and calculate their product   unsigned long long int prod = 1, count = 0;   for (unsigned long long int i = 2; count < n; i++){      if (prime[i]){         prod *= i;         count++;      }   }      // Find next prime greater than product   unsigned long long int nextPrime = prod + 2;   while (!prime[nextPrime])      nextPrime++;         // Fortunate number is difference between prime and product   return nextPrime - prod;}int main(){   int n = 25;   cout << n << "th Fortunate number : " << nthFortunate(n);   return 0;}

输出

15th Fortunate number : 107

时间复杂度 – O(n log(log(n)))

空间复杂度 – O(MAX)

结论

综上所述,第n个幸运数可以通过以下两种方式找到。

初等方法:求前n个素数的乘积,并根据乘积计算下一个素数。质数与乘积之差是第 n 个幸运数。

埃拉托斯特尼筛法:找出所有达到某个极限的素数,然后计算与下一个素数的乘积,从而找到幸运数。

仅由于变量大小的限制,这两种方法对于较小的 n 值都是有效的。对于更大的值,需要更高效和优化的解决方案。

以上就是找到第n个幸运数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:03:30
下一篇 2025年12月15日 14:42:00

相关推荐

  • C程序的朴素模式搜索算法

    C 中的模式匹配– 我们必须查找一个字符串是否存在于另一个字符串中,例如,字符串“algorithm”存在于字符串“naive algorithm”中。如果是找到,然后显示它的位置(即它所在的位置)。我们倾向于创建一个函数,它接收 2 个字符数组,如果匹配则返回位置,否则返回 -1。 I…

    2025年12月17日
    000
  • 如何优化C++大数据开发中的数据归并算法?

    如何优化C++大数据开发中的数据归并算法? 引言:数据归并是在大数据开发中经常遇到的一个问题,特别是在处理两个或多个已排序数据集合时。在C++中,我们可以通过使用归并排序的思想来实现数据归并算法。然而,当数据量较大时,归并算法可能会面临效率问题。在这篇文章中,我们将介绍如何优化C++大数据开发中的数…

    2025年12月17日
    000
  • 有害数

    如果数字是正整数并且其二进制展开中的设置位数是素数,则该数字被认为是有害的。第一个有害数字是 3,因为 3 = (11)2。可以看出3的二进制表示的设定位数为2,是一个素数。 前10个有害数字是3、5、6、7、9、10、11、12、13、14。有趣的是,2的幂永远不可能是有害数字,因为它们总是只有1…

    2025年12月17日
    000
  • 如何实现C#中的归并排序算法

    如何实现C#中的归并排序算法 归并排序是一种基于分治思想的经典排序算法,其通过将一个大问题划分为多个小问题、然后逐步解决小问题并合并结果来完成排序。下面将介绍如何在C#中实现归并排序算法,并提供具体的代码示例。 归并排序的基本思想是将待排序的序列拆分为多个子序列,分别进行排序,然后再将排序好的子序列…

    2025年12月17日
    000
  • 如何使用C#编写深度学习算法

    如何使用C#编写深度学习算法 引言:随着人工智能的迅猛发展,深度学习技术在许多领域取得了突破性的成果。为了实现深度学习算法的编写和应用,目前最常用的语言是Python。然而,对于喜欢使用C#语言的开发者来说,使用C#编写深度学习算法也是可行的。本文将介绍如何使用C#编写深度学习算法,并提供具体的代码…

    2025年12月17日
    000
  • 如何使用C#编写贝叶斯分类算法

    如何使用C#编写贝叶斯分类算法 贝叶斯分类算法是一种常用的机器学习算法,它基于贝叶斯定理,通过统计学的方法进行分类预测。在实际应用中,我们可以使用C#编写贝叶斯分类算法来解决各种分类问题。本文将介绍如何使用C#编写贝叶斯分类算法,并且提供具体代码示例。 步骤一:准备训练数据 首先,我们需要准备一份有…

    2025年12月17日
    000
  • 如何实现C#中的人脸识别算法

    如何实现C#中的人脸识别算法 人脸识别算法是计算机视觉领域中的一个重要研究方向,它可以用于识别和验证人脸,广泛应用于安全监控、人脸支付、人脸解锁等领域。在本文中,我们将介绍如何使用C#来实现人脸识别算法,并提供具体的代码示例。 实现人脸识别算法的第一步是获取图像数据。在C#中,我们可以使用Emgu …

    2025年12月17日
    000
  • 如何使用C#编写背包问题算法

    如何使用C#编写背包问题算法 背包问题(Knapsack Problem)是一个经典的组合优化问题,它描述了一个给定容量的背包以及一系列物品,每个物品都有自己的价值和重量。目标是找到一种最佳策略,使得在不超过背包容量的情况下,装入背包的物品总价值最大。 在C#中,可以通过动态规划方法来解决背包问题。…

    2025年12月17日
    000
  • c语言 三种求回文数的算法

    今天小编和大家分享的文章是c语言的三种描述回文数的算法,具有一定参考价值,对c语言回文数有兴趣的可以来看看,希望对你有所帮助。 题目描述 注意:(这些回文数都没有前导0)1位的回文数有0,1,2,3,4,5,6,7,8,9   共10个;2位的回文数有11,22,33,44,55,66,77,88,…

    2025年12月17日
    000
  • 伪代码是什么?如何写一个伪代码?

    伪代码是经常用于编程和基于算法的字段的术语;它是一种允许程序员表示算法实现的方法。简单地说,我们可以说它是算法的熟化表示。本篇文章就来带大家简单认识一下伪代码,介绍简单的c语言伪代码怎么写,希望对大家有所帮助。 伪代码是什么? 通常,算法是在伪代码的帮助下表示的,因为无论学习什么编程语言或掌握多深的…

    2025年12月17日
    000
  • Golang实现短链接服务 算法与存储设计

    短链接服务核心是唯一标识生成与高效存储。采用“分布式ID+Base62编码”算法可保证唯一性与较短长度,结合“MySQL/PostgreSQL+Redis”存储架构,利用Redis缓存高频读取,数据库持久化保证一致性,Golang通过goroutine处理高并发,配合连接池、异步队列与监控实现高性能…

    2025年12月15日
    000
  • 如何解决背包问题?

    动态规划是解决0/1背包问题的核心方法,通过构建dpi表示前i件物品在容量j下的最大价值,利用状态转移方程dpi = max(dpi-1, v[i] + dpi-1])逐层求解,最终得到dpn为最优解;该方法时间复杂度O(nW),空间复杂度可优化至O(W);相比贪心算法仅适用于分数背包、回溯法效率低…

    2025年12月14日
    000
  • Python开发建议:学习并应用数据结构和算法

    在过去的几年里,Python已成为最受欢迎的编程语言之一,因为它易于学习和使用。作为一名Python程序员,您可能发现自己已经掌握了基本语法和一些高级概念。然而,如果您想写出更优秀、高效的程序,我们建议您学习并应用数据结构和算法。 数据结构是一种将数据组织起来存储和操作的方式。数据结构可以影响程序的…

    2025年12月13日
    000
  • Python中的排序算法有哪些?

    Python中常用的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。下面将分别介绍这些排序算法的原理,并给出相应的代码示例。 冒泡排序:冒泡排序是一种简单直观的排序算法。它重复地遍历要排序的列表,比较相邻两个元素大小,并将大的元素向后移动。在每次遍历过程中,最大的元素会“冒泡”…

    2025年12月13日
    000
  • 如何优化Python中的算法和数据结构

    如何优化Python中的算法和数据结构 在编程中,算法和数据结构是非常重要的。一个高效的算法和合适的数据结构可以大大提高程序的性能。而Python作为一种高级编程语言,提供了丰富的库和语法糖,使得编写算法和数据结构变得更加简洁和易读。本篇文章将介绍一些优化Python中算法和数据结构的技巧,并提供具…

    2025年12月13日
    000
  • 如何使用Python实现素数判断的算法?

    如何使用Python实现素数判断的算法? 素数是指只能被1和自身整除的正整数,例如2、3、5、7等。素数的判断是一个常见的算法问题,本文将介绍如何使用Python编写一个简单且高效的素数判断算法。 首先,我们需要明确判断素数的条件。对于一个正整数n,如果存在一个数k,满足2 接下来,我们就可以编写代…

    2025年12月13日
    000
  • 如何使用Python实现Floyd-Warshall算法?

    如何使用Python实现Floyd-Warshall算法? Floyd-Warshall算法是一种用于解决所有源点到所有目标点的最短路径问题的经典算法。它是一种动态规划算法,可用于处理有向图或负权边问题。本文将介绍如何使用Python实现Floyd-Warshall算法,以及提供具体的代码示例。 F…

    2025年12月13日
    000
  • 如何用Python编写插入排序算法?

    如何用Python编写插入排序算法? 插入排序是一种简单直观的排序算法,它的思想是将待排序的数组分为有序部分和无序部分,每次从无序部分中选择一个元素插入到有序部分的正确位置。插入排序算法的实现通常通过多次比较和交换元素来实现,时间复杂度为O(n^2)。 下面我们就来看一下用Python语言如何编写插…

    2025年12月13日
    000
  • 如何用Python编写人工神经网络算法?

    如何用Python编写人工神经网络算法? 人工神经网络(Artificial Neural Networks)是一种模拟神经系统结构和功能的计算模型,它是机器学习和人工智能中重要的一部分。Python是一种功能强大的编程语言,具有广泛的机器学习和深度学习库,如TensorFlow、Keras和PyT…

    2025年12月13日
    000
  • 如何用Python编写求解排列组合的算法?

    如何用Python编写求解排列组合的算法? 简介:在数学和计算机科学中,排列组合是一种常见的数学概念,它可以帮助我们解决许多实际问题。在本文中,我将介绍如何使用Python编写算法来求解排列组合问题,并提供具体的代码示例。 一、排列和组合的定义在开始编写算法之前,我们先来了解一下排列和组合的定义。 …

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信