素数程序编写怎么计算100000以后的1000个素数以及相邻两个素数的最小距离

写一个程序依次寻找100000以后的10000个素数,计算这些素数相邻两个之间的间
距,寻找相邻的间距最小的素数对,将相邻最小间距、相邻最小间距素数对的个数、最大
的相邻间距最小的素数对输出。

思路:
1.先写一个判断素数的函数(对于数字n,从2到sqrt(n)进行判断,如果有数字能被n整除,n就不是素数)
2.whie循环遍历,直到素数的个数等于10000,如果数字n是素数,就根据当前的素数个数进行处理。
运行结果如下:

img

C语言代码:

#include <stdio.h>
#include <math.h>

//判断是否是素数
int isPrime(int n)
{
    int i, t;
    t = (int)sqrt(n);
    for (i = 2; i <= t; i++)
    {
        if (n % i == 0)
            return 0;
    }
    return 1;
}


int main()
{
    int start = 100000;
    int min_1 = 0, min_2 = 0;//相邻的间距最小的素数对
    int mindistance = -1; //相邻最小间距
    int maxdistance = -1; //相邻最大间距
    int cnt_min = 0; //相邻最小间距素数对的个数 
    int max_1 = 0, max_2 = 0;//最大的相邻间距最小的素数对
    int n = 0; //素数的总个数
    while (n < 10000)
    {
        if (isPrime(start))
        {
            n++; //素数总个数+1
            if (n == 1)
            {
                min_1 = start;
                max_1 = start;
            }
            else if (n == 2)
            {
                min_2 = start;
                max_2 = start;
                mindistance = min_2 - min_1;
                maxdistance = max_2 - max_1;
                cnt_min = 1;
            }
            else
            {
                //判断start与min_2之间的距离与最小间距
                if (start - min_2 < mindistance) //如果间距更小,则更新最小间距素数对
                {
                    mindistance = start - min_2;
                    min_1 = min_2;
                    min_2 = start;
                    cnt_min = 1; //重置计数
                }
                else if (start - min_2 < mindistance) //如果距离与最小间距相等,则只增加对数
                    cnt_min++; //计数+1

                //判断start与max_2之间的距离与最大间距
                if (start - max_2 > maxdistance)//如果间距更大,则更新最大间距素数对
                {
                    maxdistance = start - max_2;
                    max_1 = max_2;
                    max_2 = start;
                }
            }
        }
        start++;
    }
    printf("相邻的间距最小的素数对:%d %d\n", min_1, min_2);
    printf("相邻最小间距:%d\n",mindistance);
    printf("相邻最小间距素数对的个数:%d\n", cnt_min);
    printf("最大的相邻间距最小的素数对:%d %d", max_1, max_2);
    return 0;
}

用这个思路编写这个程序:

  1. 使用素数筛法来生成10000个大于100000的素数。
  2. 计算相邻素数之间的间距,并将间距存储在一个列表中。
  3. 遍历列表,找出相邻最小间距、最小间距素数对的个数,并将其输出。
  4. 找出最大的相邻间距最小的素数对,并将其输出。

#include <iostream>
#include <cmath>
using namespace std;

bool is_prime(int n) {
    if (n <= 1) return false;
    int m = sqrt(n);
    for (int i = 2; i <= m; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    int cnt = 0, min_d = 0x7fffffff, max_d = 0, min_d_cnt = 0, num1, num2;
    for (int i = 100000; cnt < 1000; i++) {
        if (is_prime(i)) {
            cnt++;
            if (cnt > 1) {
                int d = i - num2;
                if (d < min_d) {
                    min_d = d;
                    min_d_cnt = 1;
                } else if (d == min_d) {
                    min_d_cnt++;
                }
                if (d > max_d) {
                    max_d = d;
                }
            }
            num2 = i;
        }
    }
    cout << "最小相邻间距:" << min_d << endl;
    cout << "相邻最小间距素数对的个数:" << min_d_cnt << endl;
    cout << "最大相邻间距最小的素数对:" << max_d << endl;
    return 0;
}

说明:

is_prime函数用来判断给定数字是否为素数
变量cnt用来记录已经找到的素数个数,当cnt=1000时终止循环
min_d记录相邻最小间距,min_d_cnt记录相邻最小间距素数对的个数,max_d记录最大的相邻间距最小的素数对
num2记录上一个素数,在找到当前素数时计算相邻间距

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632