C++超级素数(Sprime)

题目描述

        超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数总为质数,例如373->37->3,233->23->2,这两个都是长度为3的超级素数。

输入

        输入一个整数n (10≤n≤1000000000)。

输出

        从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格。

样例组

样例1
输入 10
输出 2 3 5 7

样例2
输入 100
输出 2 3 5 7 23 29 31 37 53 59 71 73 79

题目思路

        这道题由于数据范围比较大,用普通的判素数函数+单循环判断绝对是不行的,用埃式筛也是不可以的(数组开不到这么大)。同时,这种题目也不像可以用各种朴素算法通过的题目。因此,我们可以借助STL中的队列(queue)来解决这道题目。

        我们可以先开一个数组(或STL里的vector<>)储存最后的答案,再开一个队列,将2,3,5,7四个素数弹入队列,然后判断q.front是否大于输入的值,如果大于,弹出;否则将q.front存入数组,同时开一个变量T储存q.front,并将其弹出队列。紧接着,我们可以用一层for循环循环1-9的奇数,看T在末尾加上那个奇数后是否是质数。如果是,将加上那个奇数后的T弹入队列。至于怎么判质数?用洛谷筛(O(sqrt(n))还是能过的。

      &n

C++中,超级素数是指大于2的自然数,除了2和所有质数外,不能被其他任何质数整除的数。由于超级素数的数量相对较少,且它们的计算通常涉及到复杂的算法,尤其是当数字非常大时。 一种常见的方法是使用埃拉托斯特尼筛法(Sieve of Eratosthenes)筛选出一定范围内的素数,然后再检查哪些是超级素数。首先,你需要编写一个函数来生成所有小于给定数n的质数,然后遍历这个列表,对于每个质数p,跳过所有的倍数p^2,因为这些肯定不是超级素数。最后统计剩余的数就是超级素数的数量。 以下是一个简单的示例,展示了如何用C++计算特定范围内超级素数的数量: ```cpp #include <iostream> #include <vector> // Function to check if a number is prime bool isPrime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; ++i) { if (num % i == 0) return false; } return true; } // Function to count super-primes in a range int countSuperPrimes(int n) { std::vector<bool> primes(n + 1, true); // Initialize all numbers as prime primes[0] = primes[1] = false; for (int p = 2; p * p <= n; ++p) { if (primes[p]) { // If prime, mark its multiples as not prime for (int i = p * p; i <= n; i += p) primes[i] = false; } } int superPrimesCount = 0; for (int i = 2; i <= n; ++i) { if (primes[i] && !isPrime(i)) { // Check if it's a super-prime superPrimesCount++; } } return superPrimesCount; } int main() { int limit; std::cout << "Enter the upper limit for counting super-primes: "; std::cin >> limit; int superPrimeCount = countSuperPrimes(limit); std::cout << "Number of super-primes below " << limit << ": " << superPrimeCount << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值