Pythonで送信したい場合はそのまま送信してください

問題の説明

        1898年——送りたければ送れ。1993 までのすべての素数を小さい順に 1 行目に並べてください。2 行目の各数値は、その上にある 2 つの隣接する素数の差に等しくなります。調べるためのプログラミング: 数値の 2 行目に、合計がちょうど 1898 になる連続した整数がいくつかありますか? 存在する場合、そのような状況はいくつありますか?

        上記の問題の要件を正確に満たす素数 P の連続リストが存在すると仮定し、この問題を分析してみましょう。1行目はP[0]、P[1]、…、P[n]、2行目はP[1] - P[0]、P[2] - P[1]、… 、P[n] - P[n-1]。2 行目の数値を P[n] - P[0] に加算すると、P[n] - P[0] = 1898 となります。導出プロセスを次の図に示します。

したがって、この質問の本質は、1993 以下の素数の中に、その差が 1898 に等しい 2 つの素数があるかどうかです。

送りたいなら送ってください

        と聞きたいので、問題の本質は、1993年以下の素数の中で、その差が1898に等しい素数が2つあるかどうかを調べることです。次に、まず 1993 以下のすべての素数をリストする素数を生成するジェネレーターを作成します。次に、この素​​数リストを調べて、その差が 1898 に等しい 2 つの素数があるかどうかを確認し、存在する場合はそれらを出力します。

素数生成器

        まず、素数の生成に役立つ素数ジェネレーターを作成します。ここではエーリッヒふるい法を使用して素数を生成します。コードは次のとおりです。

def primes_generator(n):
    """
    素数生成器

    :param n: 生成的最后一个素数小于等于n
    :return: Generator
    """
    yield 2  # 素数生成器遇到第一个next函数时返回2,并等待下一个next函数
    primes = list(range(3, n + 1, 2))  # 创建第一个元素为3最后一个元素小于n+1的奇数列表
    while primes:  # primes为空列表时结束循环
        yield primes[0]  # 素数生成器遇到next函数时返回列表primes的第一个元素,并等待下一个next函数
        primes = [i for i in primes if i % primes[0] > 0]  # 使用列表生成器把列表primes中的每一个元素都对primes的第一个元素取余,如果余数大于0则在新列表中添加该元素,最后返回新列表赋值给primes

送信したい場合は実行関数を送信してください

        素数生成器が完成したので、素数生成器を使用して必要な素数をすばやく生成できます。あとは、1993 を超えない素数のうち、その差が 1898 である 2 つの素数があるかどうかを調べるプログラムを設計するだけです。まず最大の素数を被減数として使用し、最初の素数 2 から減算を試み、次に 1 つずつ逆方向に試行して、どの素数の差が 1898 以下であるかを確認します。差が 1898 に等しい場合は、一連の解が見つかったことを意味します。差が 1898 未満の場合は、逆方向に試行する必要はありません。2 番目に大きい素数を被減数として使用して、解を見つけてみてください。このサイクルは、解が見つかるまで続きます。1898 より小さい素数を引く場合、それを探す必要はありません (すでに 1898 より小さい数を引くと、素数はさらに小さくなります)。コードは以下のように表示されます:

def primes_sum_1898(big, primes_sum):
    """
    要发就发问题

    :param big: 不大于某个数
    :param primes_sum: 连续素数之和
    :return:
    """
    primes_list = list(primes_generator(big))  # 使用list函数把素数生成器中的生成的素数全部取出来变成一个素数列表
    for i in primes_list[::-1]:  # 逆序输出素数列表
        if i < primes_sum:  # 判断素数i是否小于连续素数之和
            break  # i小于连续素数之和时结束循环
        for n in primes_list:  # 正序输出素数列表
            if i - n < primes_sum:  # 判断两个素数之差是否小于连续素数之和
                break  # 两个素数之差小于连续素数之和时结束循环
            elif i - n == primes_sum:  # 判断两个素数之差是否等于连续素数之和
                print(primes_list[primes_list.index(n):primes_list.index(i)+1])  # 打印出满足条件的连续素数列表

完全なコード

        素数生成器とヒットアンドミス実行機能を組み合わせると、ヒットアンドミス問題を解決するプログラムが得られます。完全なコードは次のとおりです。

def primes_generator(n: int):
    """
    素数生成器

    :param n: 生成的最后一个素数小于等于n
    :return: Generator
    """
    yield 2  # 素数生成器遇到第一个next函数时返回2,并等待下一个next函数
    primes = list(range(3, n + 1, 2))  # 创建第一个元素为3最后一个元素小于n+1的奇数列表
    while primes:  # primes为空列表时结束循环
        yield primes[0]  # 素数生成器遇到next函数时返回列表primes的第一个元素,并等待下一个next函数
        primes = [i for i in primes if i % primes[0] > 0]  # 使用列表生成器把列表primes中的每一个元素都对primes的第一个元素取余,如果余数大于0则在新列表中添加该元素,最后返回新列表赋值给primes


def primes_sum_1898(big: int, primes_sum: int):
    """
    要发就发问题

    :param big: 不大于某个数
    :param primes_sum: 连续素数之和
    :return:
    """
    primes_list = list(primes_generator(big))  # 使用list函数把素数生成器中的生成的素数全部取出来变成一个素数列表
    for i in primes_list[::-1]:  # 逆序输出素数列表
        if i < primes_sum:  # 判断素数i是否小于连续素数之和
            break  # i小于连续素数之和时结束循环
        for n in primes_list:  # 正序输出素数列表
            if i - n < primes_sum:  # 判断两个素数之差是否小于连续素数之和
                break  # 两个素数之差小于连续素数之和时结束循环
            elif i - n == primes_sum:  # 判断两个素数之差是否等于连续素数之和
                print(primes_list[primes_list.index(n):primes_list.index(i)+1])  # 打印出满足条件的连续素数列表


primes_sum_1898(1993, 1898)

実行結果は以下の通りです。

この問題には 3 組の解があることがわかります。1 組目は 89 から 1987 までの連続素数、2 組目は 53 から 1951 年までの連続素数、3 組目は 3 から 1901 までの連続素数です。 。上記のプログラムを使用すると、同様の問題を送信したいときに簡単に解決できます。

おすすめ

転載: blog.csdn.net/qq_40148262/article/details/130992581