70,007
社区成员




快输入
5
素数有:
5
快输入:
1
素数有:
2
快输入:
20
素数有:
19
快输入:
18
素数有:
19 17
快输入:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
/*********************************\
* int prime(int n)
* 筛法构造2....n的素数表
* O(nlgn)
\*********************************/
const int MAXSIZE=10000000;
int p[MAXSIZE];
int vis[MAXSIZE];
int c;
int prime(int n)
{
int m=(int)sqrt(n+0.5);
int c=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;++i)
{
if(!vis[i])
{
p[c++]=i;
}
for(int j=i*i;j<=n;j+=i)
{
vis[j]=1;
}
}
for(int k=m+1;k<=n;++k)
{
if(!vis[k])
{
p[c++]=k;
}
}
return c;
}
void getCloestPrime(int n,int *first,int *second)
{
int *q=lower_bound(p,p+c,n); //二分找n
if(q!=p+c)
{
if(*q==n)
{
*first=n;
*second=-1;
return;
}
int dist1,dist2;
dist1=dist2=MAXSIZE;
dist1=*q-n;
if(q-1>=p)
{
dist2=n-*(q-1);
}
if(dist2==MAXSIZE)
{
*first=*q;
*second=-1;
}
else if(dist1!=dist2)
{
*first= dist1<dist2 ? *q:*(q-1);
*second=-1;
}
else
{
*first=*q;
*second=*(q-1);
}
}
else
{
*first=*(q-1);
*second=-1;
}
}
int main()
{
int n,first,second;
c=prime(MAXSIZE-1); //这里慢一点
cout<<"快输入"<<endl;
while(cin>>n)
{
getCloestPrime(n,&first,&second);
cout<<"素数有:"<<endl;
if(first!=-1)
{
cout<<first<<" ";
}
if(second!=-1)
{
cout<<second<<" ";
}
cout<<endl<<"快输入:"<<endl;
}
return 0;
}
#include<stdio.h>
int panduan(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int m,last,next;
printf("请输入一个正整数:");
scanf(" %d",&m);
last=m-1;
next=m+1;
while(!panduan(last))
{
last--;
}
while(!panduan(next))
{
next++;
}
if(m-last<next-m)
{
printf("最近的素数为:%d\n",last);
}
if(m-last==next-m)
{
printf("最近的素数为:%d和%d\n",last,next);
}
if(m-last>next-m)
{
printf("最近的素数为:%d\n",next);
}
return 0;
}
自己写的代码!最好的办法:
1,筛法求MAX_INT以内素数,全部存储进数组arr。
2,给定一个数字n,使用lower_bound在arr里二分查找第一个大于n的素数。
#include <cstdio>
#include <cmath>
#include <cassert>
int is_prime(float x)
{
if ((int)x<1)
{
return 0;
}
int m=floor(sqrt(x)+0.5);
for (int i=2; i<=m; ++i)
{
if ((int)x%i==0) return 0;
}
return 1;
}
int main()
{
int m, beg_cnt=0, end_cnt=0, b=0;
printf("Enter a number: ");
scanf("%d",&m);
for (int i=1; ; ++i)
{
if (is_prime(m-i))
{
if (beg_cnt<=end_cnt)
{
printf("%d ", m-i);
}
b=1;
}
else
{
++beg_cnt;
}
if (is_prime(m+i))
{
if (beg_cnt<=end_cnt)
{
printf("%d ", m+i);
}
b=1;
}
else
{
++end_cnt;
}
if (b) break;
}
return 0;
}
#include <stdio.h>
/* 判断是否是素数 */
static int is_prime(size_t num)
{
size_t i;
for (i = 2; i < num; i++) {
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
size_t num = 0;
scanf("%u",&num);
if (num <=3) {
fprintf(stderr, "输入错误!\n");
return -1;
}
size_t prev = num - 1;
size_t next = num + 1;
while (!is_prime(prev)) {
prev--;
}
while (!is_prime(next)) {
next++;
}
if (num - prev < next - num) {
printf("%d 最近的素数是 %d \n", num, prev);
} else if (num - prev > next - num) {
printf("%d 最近的素数是 %d \n", num, next);
} else {
printf("%d 最近的素数是 %d , %d\n", num, prev, next);
}
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int num)
{
for(int i = 2;i < num; ++i )
{
if( num % i == 0 )
{
return false;
}
}
return true;
}
int main()
{
int number;
int number1,number2;
cout << "input number: " << endl;
cin >> number;
while( number < 3 )
{
cout << "number < 3 ,input again!"<< endl;
cin >> number;
}
number1 = number + 1;
number2 = number - 1;
while(1)
{
if( isPrime(number1) && !isPrime(number2))
{
cout << number1 << endl;
break;
}
else if( !isPrime(number1) && isPrime(number2) )
{
cout << number2 << endl;
break;
}
else if( isPrime(number1) && isPrime(number2) )
{
cout << number1 << number2 << endl;
break;
}
else
{
++number1;
--number2;
}
}
return 0;
}
#include <stdio.h>
/* 判断是否是素数 */
static int is_prime(size_t num)
{
size_t i;
for (i = 2; i < num; i++) {
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
size_t num = 0;
scanf("%u",&num);
if (num <=3) {
fprintf(stderr, "输入错误!\n");
return -1;
}
size_t prev = num - 1;
size_t next = num + 1;
while (!is_prime(prev)) {
prev--;
}
while (!is_prime(next)) {
next++;
}
if (num - prev < next - num) {
printf("%d 最近的素数是 %d \n", num, prev);
} else if (num - prev == next - num) {
printf("%d 最近的素数是 %d \n", num, next);
} else {
printf("%d 最近的素数是 %d , %d\n", num, prev, next);
}
return 0;
}