写一个实现迭代器协议的类Primes 让此类可以生成从b开始的n个素数

本文介绍了一个简单的Python类,用于生成指定范围内的素数。通过迭代和除法检查的方法判断一个数是否为素数,并使用迭代器协议实现了素数生成器。
class Primes:
    @staticmethod
    def __isprime(x):
        for i in range(2, x):
            if x % i == 0:
                return False
        return True


    def __init__(self, b, n):
        self.begin = b
        self.count = n


    def __iter__(self):
        self.cur_pos = self.begin
        self.cur_count = 0
        return self


    def __next__(self):
        if self.cur_count >= self.count:
            raise StopIteration
        self.cur_count += 1  # 计数加1
        while True:
            if self.__isprime(self.cur_pos):
                v = self.cur_pos
                self.cur_pos += 1
                return v
            self.cur_pos += 1




for x in Primes(10, 4):
    print(x)  # 11 13 17 19
在C++中,如果你想找到一个大于给定素数p的最小素数以及小于p的最大素数,可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来生成素列表,然后使用迭代器进行查找。以下是基本步骤: ```cpp #include <iostream> #include <vector> using namespace std; // 判断是否为素数 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; } // 使用埃拉托斯特尼筛法生成素 void sieveOfEratosthenes(int n, vector<int>& primes) { vector<bool> isComposite(n + 1, false); for (int p=2; p*p<=n; p++) { if (!isComposite[p]) { // 将p的倍标记为合 for (int i=p*p; i<=n; i += p) isComposite[i] = true; } } // 把非合存入primes for (int p=2; p<=n; p++) if (!isComposite[p]) primes.push_back(p); } int main() { int givenPrime; cout << "Enter a prime number: "; cin >> givenPrime; vector<int> primes; sieveOfEratosthenes(givenPrime + 1, primes); // 生成到givenPrime+1范围内的素数 // 找出大于给定素数的最小素数和小于给定素数的最大素数 int nextPrime = primes.back(); // 最大素数就是最后一个元素 if (nextPrime > givenPrime) { // 如果还有下一个素数,说明找到了最大素数 primes.pop_back(); while (primes.back() < givenPrime) { primes.pop_back(); if (primes.empty()) break; } if (!primes.empty()) { nextPrime = primes.back(); // 找到了第一个大于givenPrime的素数 } else { nextPrime = -1; // 如果所有素数都小于givenPrime,设为-1表示找不到 } } cout << "Next prime greater than " << givenPrime << " is: " << nextPrime << endl; cout << "Previous prime smaller than " << givenPrime << " is: " << primes.empty() ? -1 : primes[primes.size()-2] << endl; // 相关问题--
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值