写一个程序依次寻找100000以后的10000个素数,计算这些素数相邻两个之间的间
距,寻找相邻的间距最小的素数对,将相邻最小间距、相邻最小间距素数对的个数、最大
的相邻间距最小的素数对输出。
思路:
1.先写一个判断素数的函数(对于数字n,从2到sqrt(n)进行判断,如果有数字能被n整除,n就不是素数)
2.whie循环遍历,直到素数的个数等于10000,如果数字n是素数,就根据当前的素数个数进行处理。
运行结果如下:
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;
}
用这个思路编写这个程序:
#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记录上一个素数,在找到当前素数时计算相邻间距