在证明数素无穷性时,使用了一个表达式 N=2*3*5*7*11…….*P + 1,其中 P 为一个素数,N 是 2 到 P 中所有素数的乘积加 1,若 P 为最大的素数,可以反证出 N 也是素数,从而证明素数是无穷多的。但有人因此认为,所有的 N 都是素数。如N0 = 3 为 素数,N1 = 7 为素数,N2 = 31 为素数。请判断第 i 个 N 是否为素数。
在证明数素无穷性时,使用了一个表达式 N=2*3*5*7*11…….*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
7 is a prime
#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); }
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')
为什么在题目中运行会显示超时,大佬知道怎么优化吗,看通过的代码没看出来import sysdef aa(num):i=2whilei < num:if num %i ==0:returnFalsei +=1returnTrueif__name__ =="__main__":a =int(sys.stdin.readline().strip())num=2ni=1i=0whilei<=a:ifaa(num):ni*=numi+=1num+=1Ni=ni+1if aa(Ni):print('%d is a prime'%Ni)else:print('%d is not a prime'%Ni)
主要是对于素数的判别要进行优化,不能超时就行 #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; }
#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; }
#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; }
#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"; } }
#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; }注意一下数据范围就可以了
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)
关键在于判断素数,如何把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; } }