NYOJ 24(素数距离)
摘要:质数距离问题的时间限制:3000ms |内存限制:65535KB难度:2描述现在给你一些数字,你需要编写一个程序来输出与这些整数相邻的最近质数及其距离长度。如果左侧和右侧有等距长度的素数,则将输出左侧的值和相应的距离。如果输入整数本身是质数,则输出质数本身。测试数据集的数量N在输出0的第一行中给出,并且在接下来的N行中有一个整数M,并且在输出的每一行中输出两个整数AB。其中A表示最接近相应测试数据的质数,B表示它们之间的距离。
素数距离问题
时间限制:3000 ms | 内存限制:65535 KB
难度:2
- 描述
- 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0 - 输入
- 第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000), - 输出
- 每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。 - 样例输入
3
6
8
10
- 样例输出
5 1
7 1
11 1
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1500000
bool visit[N];
void prim()
{
int temp,i,j;
temp=(int)sqrt(N+0.5);
memset(visit,0,sizeof(visit));
for(i=2;i<=temp;i++)
if(!visit[i])
{
for(j=i*i;j<=N;j+=i)
visit[j]=1;
}
}
/*
bool is_prim(int x)
{
int s;
for(s=2;s<=sqrt(1.0*x);s++)
if(x%s==0)
return false;
return true;
}
*/
int main()
{
prim();
int T,m;int i,j=0,k; int temp1,temp2;
scanf("%d",&T);
while(T--)
{
scanf("%d",&m);
if(m==1)
{
printf("2 1\n");
continue;
}
/*
for(i=m;i>1;i--)
{
if( is_prim(m))
{
printf("%d %d\n",m,0);
break;
}
*/
for(j=m;j>=1;j--)
{
if(!visit[j])
temp2=m-j;
for(k=m+1;;k++)
if(!visit[k])
{
temp1=k-m;
break;
}
if(!visit[j]&&!visit[k])
{
if(temp1>=temp2)
/*等号表示相同情况下应输出左边的*/
printf("%d %d\n",j,temp2);
else
printf("%d %d\n",k,temp1);
break;
}
}
}
return 0;
}
免责声明:文章转载自《NYOJ 24(素数距离)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。
上篇html基础:基本标签linux中,查看某个进程打开的文件数?下篇
宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=
题意: 给出一个区间 [l, r] 求其中相邻的距离最近和最远的素数对 . 其中 1 <= l < r <= 2,147,483,647, r - l <= 1e6 . 思路: 素数区间筛 要找到 [l, r] 中相邻最近和最远的素数对肯定是需要找出 [l, r] 内所有素数 . 但是无论是直接线性打表还是暴力都处理不了这么大的数据...
[编程题] 超级素数幂 时间限制:1秒 空间限制:32768K 如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。 输入描述: 输入一个正整数n(2 ≤ n ≤ 10^18) 输出描述: 如果n是一个超级素数幂则输出p,q,以空格...