首页 > 试题广场 >

无穷素数

[编程题]无穷素数
  • 热度指数:1166 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

在证明数素无穷性时,使用了一个表达式 N235711…….P + 1,其中 P 为一个素数,N 2 P 中所有素数的乘积加 1,若 P 为最大的素数,可以反证出 N 也是素数,从而证明素数是无穷多的。但有人因此认为,所有的 N 都是素数。如N0 = 3 素数,N1 = 7 为素数,N2 = 31 为素数。请判断第 i N 是否为素数。


输入描述:
每组输入只有一行,包含一个整数i(0 <= i <= 14),表示要检查的是第i个N。


输出描述:
输出只有一行,若Ni为素数,打印“Ni is a prime”,否则打印“Ni is not a prime”。
示例1

输入

1

输出

7 is a prime
贴C++版答案
#include <iostream>
#include <math.h>
using namespace std;

bool isPrime(long long num){
    if (num == 0 || num == 1)
        return false;
    if (num == 2 || num == 3)
        return true;
    for (int i = 2; i < int(sqrt(num) + 1); i++){
        if (num % i == 0)
            return false;
    }
    return true;
}

int main(){
    int i;
    cin >> i;
    long long N = 1; 
    int p = 1;
    while (i >= 0){
        for (int k = p + 1; k > 0; k++){
            if (isPrime(k)){
                p = k;
                N *= p;
                break;
            }
        }
        i--;
    }
    N = N + 1;
    if (isPrime(N))
        printf("%ld is a prime\n", N);
    else
        printf("%ld is not a prime\n", N);
}



发表于 2022-07-26 00:36:06 回复(0)
import math
a=int(input())
def isPrime(x):
  for i in range(2,math.floor(math.sqrt(x))):
    if x % i == 0:
      return False
  return True
prime=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
result=1
for i in range(a+1):
  result *= prime[i]
result+=1
print(result,end=' ')
if isPrime(result):
  print('is a prime')
else:
  print('is not a prime')

发表于 2020-08-14 22:22:25 回复(0)
为什么在题目中运行会显示超时,大佬知道怎么优化吗,看通过的代码没看出来
import sys
def aa(num):
    i=2
    whilei < num:
        if num %i ==0:
            returnFalse
        i +=1
    returnTrue
if__name__ =="__main__":
    a =int(sys.stdin.readline().strip())
    num=2
    ni=1
    i=0
    whilei<=a:
        ifaa(num):
            ni*=num
            i+=1
        num+=1
    Ni=ni+1
    if aa(Ni):
        print('%d is a prime'%Ni)
    else:
        print('%d is not a prime'%Ni)

编辑于 2020-07-01 16:29:30 回复(0)
主要是对于素数的判别要进行优化,不能超时就行


#include<iostream>
#include<math.h>
using namespace std;
 
bool is_prime(long long n){
    if(n==2||n==3) return 1;
    else if(n%2==0&&n!=2) return 0;
    for(int i=3;i<int(sqrt(n)+1);i=i+2)
        if(n%i==0){
            return 0;
        }   
    return 1;
     
}
 
int main(){
    int n;
    cin>>n;
    long long N=1;
    int h=2;
    while(n>=0){
        for(int i=h;i>0;i++){
            if(is_prime(i)){
                h=i+1;
                N=N*i;
                break;
            }
        }
        n--;
    }
    if(is_prime(N+1))
        cout<<N+1<<" is a prime"<<endl;
    else
        cout<<N+1<<" is not a prime"<<endl;
}

发表于 2020-06-30 16:58:54 回复(0)
不走捷径,常规一点。
#include<iostream>
#include<vector>
#include<string>
 
using namespace std;
 
#define Dtype long long
 
bool isPrime(Dtype N) {
    if (N < 2) return false;
    for (Dtype i = 2; i*i <= N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}
 
vector<Dtype> genPrime(int val) {
    vector<Dtype> v;
    int N = 2;
    for (int i = 0; i < val;) {
        if (isPrime(N)) {
            v.push_back(N);
            ++i;
        }
        ++N;
    }
    return v;
}
 
int main()
{
    int val = 0;
 
    while (cin >> val) {
        val = val+1;
        vector<Dtype> nums(val + 1, 0);
        nums[0] = 2;
        vector<Dtype> p = genPrime(val);
        for (int i = 1; i <= val; ++i) {
            nums[i] = (nums[i-1] - 1) * p[i-1] + 1;
        }
         
        if(isPrime(nums[val]))
            cout << nums[val] << " is a prime" << endl;
        else
            cout << nums[val] << " is not a prime" << endl;
    }
 
    return 0;
}



发表于 2020-06-29 20:06:39 回复(0)
欧拉筛选取前n个素数,后面判断;
用了unsigned long long来维持最大范围,应该30以内 都不会有问题
#include<string>
#include<vector>

#include<iostream>

using namespace std;


unsigned long long mul(vector<int>& prime)
{
	unsigned long long res = 1;
	for (int i = 0; i < prime.size(); i++)
	{
		res = res * prime[i];
	}
	return res + 1;
}

int oulashai(int n)
{
	vector<int> prime;
	vector<bool> flag(655350, false);

	for (int i = 2; prime.size() < n; i++)
	{
		if (flag[i] == false)
		{
			prime.push_back(i);
		}
		for (int j = 0; j < prime.size() && i* prime[j] <= 655350; j++)
		{
			flag[i*prime[j]] = true;
			if (i%prime[j] == 0)
				break;
		}
	}

	return mul(prime);
}


bool isPrime_3(unsigned long long n) {
	if (n == 2 || n == 3)	return 1;
	if (n % 6 != 1 && n % 6 != 5)	return 0;
	for (int i = 5; i <= floor(sqrt(n)); i += 6)
		if (n%i == 0 || n % (i + 2) == 0)	return 0;
	return 1;
}



int main()
{
	int n;
	cin >> n;


	auto ins = oulashai(n + 1);
	if (isPrime_3(ins))
	{
		cout << ins << " is a prime" << endl;
	}
	else
	{
		cout << ins << " is not a prime" << endl;
	}

	return 0;

}


发表于 2020-06-09 14:45:35 回复(0)
#include<bits/stdc++.h>
using namespace std;
bool isPrime(long x)
{
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    return true;
}
int main()
{
    int x;
    int num[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
    while(cin>>x){
    long res=1;
    for(int i=0;i<=x;i++)
    {
        res*=num[i];
    }
        res=res+1;
        if(isPrime(res)) cout<<res<<" is a prime";
        else cout<<res<<" is not a prime";
    }
}

发表于 2020-06-02 17:12:32 回复(0)
这道题数据范围不是太大,所以素数筛的话都可以放一放了
#include <iostream>
(720)#include <cmath>
using namespace std;
int x[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
int main(){
    int n;
    long long sum=1;
    cin>>n;
    for (int i = 0; i <= n; ++i) {
        sum*=x[i];
    }
    sum+=1;
    for (int j = 2; j <= sqrt(sum); ++j) {
        if(sum%j==0){
            cout<<sum<<" is not a prime";
            return 0;
        }
    }
    cout<<sum<<" is a prime";
    return 0;
}
注意一下数据范围就可以了

发表于 2020-04-02 12:11:56 回复(0)
import sys
import math
 
def isPrime(num):
    k = 2
    m = int(math.sqrt(num))
    while k <= m:
        if num % k == 0:
            return False
        k += 1
    return True
 
 
def nextPrime(N):
    N += 1
    while True:
        if isPrime(N):
            return N
        N += 1
 
 
if __name__ == "__main__":
    num = int(sys.stdin.readline().strip())
    N = 1
    i = 0
    product = 1
    while i <= num:
        next_su = nextPrime(N)
        N = next_su
        product = product * next_su
        i += 1
    product += 1
    if isPrime(product):
        print('%d is a prime' % product)
    else:
        print('%d is not a prime' % product)

发表于 2020-03-07 14:15:42 回复(0)
关键在于判断素数,如何把2-(Ni-1)对Ni判断整除,太浪费时间了,程序1s之内跑不完
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//判断是否为质数的函数
bool IfNum(long long &Ni)
{
    for (int i = 2; i<sqrt(Ni); i++)
    {
        if (Ni%i== 0)
        {
            cout << Ni << " " << "is not a prime" << endl;
            return false;
        }
        else
            continue;
    }
    return true;
}
int main()
{
    int A[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
    int n;
    while (cin >> n)
    {
        //计算Ni的值
        long long tem = 1;
        for (int i = 0; i <= n; i++)
        {
            tem *= A[i];
        }
        long long Ni = ++tem;
        //判断是否为质数
        if (IfNum(Ni))
            cout << Ni << " " << "is a prime" << endl;
        return 0;
    }
}

发表于 2020-02-08 10:29:03 回复(3)