从键盘输入一个大于3的正整数,输出距离该数最近的素数。

McColeyf 2011-04-11 09:52:11
老师布置的作业,我做了好几个小时了运行起来还是不对,望大虾指导 T T 明天就要交了

从键盘输入一个大于3的正整数,输出距离该数最近的素数。根据输入的数不同,此问题可能有一个答案(或者比输入的数大或者比输入的数小),也可能需要输出两个值(一个比输入的数大,一个比输入的数小,两个距离输入的数一样近)。

关键是循环部分,我不是很懂。。。。

因为是菜鸟,所以必须用C语言 不是C++ 不是Java等等 谢谢 急求 ~~~~
...全文
2117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-04-11
  • 打赏
  • 举报
回复
快输入
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;
}


真悲剧,怎么边界处理那么纠结。
chenxianggui 2011-04-11
  • 打赏
  • 举报
回复
#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;
}
自己写的代码!
qq120848369 2011-04-11
  • 打赏
  • 举报
回复
最好的办法:

1,筛法求MAX_INT以内素数,全部存储进数组arr。
2,给定一个数字n,使用lower_bound在arr里二分查找第一个大于n的素数。
delphiwcdj 2011-04-11
  • 打赏
  • 举报
回复
参考

#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;
}
linan7390 2011-04-11
  • 打赏
  • 举报
回复
我的思路是这样的,设输入的数是num,再定义两个变量big,small。big=num+1,small=num-1,在同一层循环中判断big与small是不是素数(判断是不是素数的程序应该好写吧,在这里要注意small的范围),之前设两个标记flag_big=0,flag_small=0
if(1 == flag_big && 1 == flag_small)则两个都是距离相等的素数
其中一个是flag是1的话就是对应的big或small是素数,两个flag都是0的话big++,small--(注意范围),接着循环求解。
liyzgmail 2011-04-11
  • 打赏
  • 举报
回复
刚才发的,最后判断应该是 > 写成 == ,现在改正,重新发一次

#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;
}
無_1024 2011-04-11
  • 打赏
  • 举报
回复

#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;
}

liyzgmail 2011-04-11
  • 打赏
  • 举报
回复

#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;
}
flyrack 2011-04-11
  • 打赏
  • 举报
回复
没有范围的话 要计算几百万的数的话循环枚举估计够呛

70,007

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧