c语言现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。

#include<stdio.h>
#include<math.h>
int main()
{
int n,m,i,j,k;
int left,right,leap=1;
int leftt=0,rightt=0,t=0;
scanf("%d\n",&n);
while(n--)
{
scanf("%d",&m);
/*判断本身是不是素数,如果是输入本身,距离为0*/
/*这里要怎么写,我感觉有问题*/
if(m==2) {break;t=0;}
for(i=2;i<m;i++){
if(m%i==0) {break;leap=0;}
t++;

if(leap==1) {printf("%d",m); printf(" 0");}
}
/*判断在输入这个数字的右边的离他最近的素数*/
/*也由问题*/
for(j=m+1;;j++)
{
leap=1;rightt=0;
for(k=2;k<j;k++)
{
if(j%k==0)
{break;leap=0;}
rightt++;
}

if(leap==1) {right=j;break;}

}
/*但是判断左边的却对了*/
*/左边对了 ,为什么写右边的就错了呢?*/
for(j=m-1;;j--)
{
leap=1;leftt=0;
for(k=2;k<j;k++)
{
if(j%k==0)
{break;leap=0;}
leftt++;
}
if(leap==1){left=j;break;}

}
if(rightt<leftt) printf("%d %d\n",right,abs(rightt-n));
if(rightt>=leftt) printf("%d %d\n",left,abs(leftt-n));

}
}

输入样式
3 /*要测试3组数据*/
6 /*第一组要判读的数字*/
8 /*第二组要判读的数字*/
10 /*第三组要判读的数字*/

输出样式
5 1 /*离输入最近数的素数,距离为1*/ /*如果左右距离相等,输入左边的*/
7 1
11 1

#include<stdio.h>
int main(void)
{
int n,m,i,k;
int leftt=0,rightt=0,t=0;
scanf("%d\n",&n);
while(n--)
{
t=2;
scanf("%d",&m);
/*判断本身是不是素数,如果是输入本身,距离为0*/
for(i=2;i<=m;i++)
{
if(m%i!=0)
{
t++;
}
if (t==m) {
printf("%d 距离=0\n",m);
break;
}
}
if (t!=m)
{
for(rightt=1;rightt<m;rightt++) /*判断在输入这个数字的右边的离他最近的素数*/
{
t=2;
for(k=2;k<=m+rightt;k++)
{
if((m+rightt)%k!=0)
{
t++;
}
if (t==m+rightt) {
break;
}
}
if (t==m+rightt) {
break;
}
}
for(leftt=1;leftt<m;leftt++) /*判断在输入这个数字的左边的离他最近的素数*/
{
t=2;
for(k=2;k<=m-leftt;k++)
{
if((m-leftt)%k!=0)
{
t++;
}
if (t==m-leftt)
{
break;
}
}
if (t==m-leftt) {
break;
}
}
if(rightt<leftt)
printf("原数=%d 素数=%d 距离向右=%d\n",m,m+rightt,rightt);
if(rightt>=leftt)
printf("原数=%d 素数=%d 距离向左=%d\n",m,m-leftt,leftt);
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-03
你做的是acm题目吧,按照你的思路的话,应该会超时的。这种题目最好使用查表的方式做,因为是不是素数都已经确定了,无论运行多少次都不会变化,所以可以先把题目范围内的素数都求出来,首先用一个足够大的int数组prim[]存储题目中给定范围内的素数(这个过程可以用快速筛选法),数组下标 t 正好对应数字本身,primt[t]中存放的值说明数字t是不是素数,prime[t] = 0说明t不是素数,prim[t] = 1 说明是素数,这样每次输入m之后,从prim[m]往前查表和往后查表就可以了。追问

你好像很懂啊?你QQ多少 求教啊

追答

就百度hi我吧,我不怎么上qq

追问

你说的查表我不太懂,我是新手,你说的这是算法吗?

追答

查表不是算法,只是一种方式。例如你有一个prim[10000]的数组,
prim[1] = 0表示1不是素数,
prim[2] = 1 表示2是素数,
prim[3] = 1表示3是素数,
.....
prim[n] = 1 表示n是素数,(或者等于0,表示n不是素数)
你只要把这个数组填充好,然后查找素数就非常简单了,比如查找n是否为素数,就检查prim[n]是否等于1就可以了。

你可以用百度hi我,在浏览器里直接像qq那样聊。

追问

能把C语言程序写出来 让我学习学习 。 写上思路 和备注 谢谢啦

追答

可以,但是如果是做acm题目的话不保证通过测评系统,因为测评系统对于程序的执行效率和空间消耗非常严格。
等一下写。

追问

恩恩 我只是想学习学习 这种 思想

追答

你等不及了?把最佳给了别人。

追问

http://zhidao.baidu.com/question/1732854076276277227.html 去这里给我留

第2个回答  2014-08-03
#include<stdio.h>
#include<math.h>
int main()
{
int n,m,i,j,k;
int left,right,leap=1;
int leftt=0,rightt=0,t=0;
scanf("%d\n",&n);
while(n--)
{
scanf("%d",&m);
/*判断本身是不是素数,如果是输入本身,距离为0*/
/*这里要怎么写,我感觉有问题*/
if(m==2) {t=0;break;} //break放在赋值后面,否则赋值不会执行
for(i=2;i<m;i++){
if(m%i==0) {leap=0;break;} //break放在赋值后面,否则赋值不会执行
//t++;

}
if(leap==1) {printf("%d",m); printf(" 0"); continue;} //放到循环外面,加上continue
/*判断在输入这个数字的右边的离他最近的素数*/
/*也由问题*/
for(j=m+1;;j++)
{
leap=1;
for(k=2;k<j;k++)
{
if(j%k==0)
{leap=0;break;}

}

if(leap==1) {right=j;break;}
}
/*但是判断左边的却对了左边对了 ,为什么写右边的就错了呢?*/
for(j=m-1;;j--)
{
leap=1;
for(k=2;k<j;k++)
{
if(j%k==0)
{leap=0;break;}

}

if(leap==1){left=j;break;}
}
rightt=abs(right-m); //righttt和leftt有存在的必要吗,直接吧找到的数减去输入的数不就行了
leftt=abs(left-m); //比如输入6,找到7,7-6不就是距离吗
if(rightt<leftt) printf("%d %d\n",right,abs(right-m));
if(rightt>=leftt) printf("%d %d\n",left,abs(left-m));

}
getchar();
}
第3个回答  2014-08-03
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
bool prime(int n){
int i;
if(n>2 && !(n&1) || n<2) return false;
for(i=3; i*i<=n;i+=2)
if(!(n%i)) return false;
return true;
}
void main(void){
int n,i,j,x,a[30];
printf("How many sets of data(<30)?\nn=");
scanf("%d",&n);
for(j=i=0;i<n;scanf("%d",a+i++));
while(n--){
for(x=0,i=a[j];;i++,x++)
if(prime(i)){
printf(">=%d: %d\t%d\n",a[j],i,x);
break;
}
if(i<0) printf("There is no prime of >= %d!\n",a[j]);
for(x=0,i=a[j];i>1;i--,x++)
if(prime(i)){
printf("<=%d: %d\t%d\n",a[j],i,x);
break;
}
if(i==1) printf("There is no prime of <= %d!\n",a[j]);
j++;
}
}追问

能帮我看下我的问题吗? 就是判断本身是不是?

相似回答