素数最短距离算法

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

#define MAX_LENGTH 50000001

bool prime[MAX_LENGTH];

void CreatePrimeTable()
{
	int i, j;

	memset(prime, true, sizeof(prime)); // 初始化全为1
	prime[0] = prime[1] = false;  // 0和1不是素数

	for (i = 2; i * i < MAX_LENGTH; i++)
	{
		if (prime[i]) // 如果是素数
		{
			// 如果i是素数,那么能整除i的肯定不是素数
			for (j = i * 2; j < MAX_LENGTH; j += i)
			{
				prime[j] = false;
			}
		}
	}
}

int main()
{
	int number = 0;
	long prevDist = 0, // 当前素数与前一个素数的距离
		 nextDist = 0; // 当前素数与后一个素数的距离
	int i = 0, j = 0;

	CreatePrimeTable();

	while (scanf("%d", &number) != EOF)
	{
		prevDist = 0;
		nextDist = 0;
		if (prime[number]) // 如果是素数
		{
			printf("%d ", number);

			for (i = number - 1; i >= 2; i--)
			{
				if (prime[i] != 0)
				{
					prevDist = number - i;
					break;
				}
			}

			for (i = number + 1; i < MAX_LENGTH; i++)
			{
				if (prime[i] != 0)
				{
					nextDist = i - number;
					break;
				}
			}

			printf("%d\n", prevDist < nextDist ? prevDist : nextDist);
		}
		else
		{
			printf("%d不是素数\n", number);
		}
	}
	return 0;
}
时间: 2024-10-30 20:51:37

素数最短距离算法的相关文章

c语言-求教C语言判断素数程序算法,为何j&amp;amp;lt;=sqrt((double)i )??

问题描述 求教C语言判断素数程序算法,为何j<=sqrt((double)i )?? #include #include void fun(int a, int b, int *c) { int i,j,d,y; for (i=3;i<=a/2;i=i+2) { /************found**************/ y=1; for (j=2;j<=sqrt((double)i );j++)//??为何j<=sqrt((double)i )?? if (i%j==0)

C#入门经典第十一章 求素数的算法

问题描述 感觉被我注释掉的算法很复杂~usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCh11Ex03{publicclassPrimes{privatelongmin;privatelongmax;///publicPrimes():this(2,100)///{///}publicPrimes(longminmum,lo

C#判断素数的算法

素数是只能被1或本身整除,且不能为其他两个整数的乘积.1.2.3本身就是素数,判断一个数是否为素数,只需要用这个值依次除以2到它的开方数,如果其中有一个数可以整除,那么该值不为素数,返之为素数.代码如下: using System; using System.Collections.Generic; using System.Text; namespace ExPrimeNumber { class PrimeNumber { public bool primeNumber(int n) { b

素数最短距离问题

素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度. 如果左右有等距离长度素数,则输出左侧的值及相应距离. 如果输入的整数本身就是素数,则输出该素数本身,距离输出0 输入 第一行给出测试数据组数N(0<N<=10000) 接下来的N行每行有一个整数M(0<M<1000000), 输出 每行输出两个整数 A B. 其中A表示离相应测试数据最近的素数,B表示其间的距离

Rabin-Miller算法,判断大素数

问题描述 Rabin-Miller算法,判断大素数 Rabin-Miller算法,来判断大素数! 求完整算法程序!谢谢!! 解决方案 参考:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646396.htmlhttp://blog.csdn.net/wmn_wmn/article/details/7367657http://blog.163.com/shikang999@126/blog/static/172624896201211472

【算法编程】基于Miller-Rabin的大素数测试

基本原理: 费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)%p=1.       利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过计算d=a^(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n  很可能是素数. 二次探测定理:如果p是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或x=p-1.       利用二次探测定理,可以再利用费尔马小定理计算a^(n-1)%n的过程中增加对整数n的二次探测,一旦发现违背二次探

《算法基础》——2.4 有关素数的运算

2.4 有关素数的运算 众所周知,一个素数是一个大于1的自然数(一个比0大的整数),它的因数只有1和它本身.一个合数是一个大于1并且非素数的自然数.素数在某些应用中起到重要的作用,在这些应用中素数的特质使得它们能够使特定程序变得简单或繁琐.例如,某些加密程序使用两个大素数的积来保证安全性.将一个由两个大素数相乘得到的数分解成两个大素数是十分困难的,而正是这个事实保证了算法的安全性.以下章节将讨论一些处理素数的常见算法.2.4.1 寻找素数因子寻找一个数的素因子最显而易见方法是尝试将这个数用比其小

《算法基础:打开算法之门》一1.1 正确性

1.1 正确性 产生问题的一个正确解决方案意味着什么呢?我们通常会精确地定义一个正确的解决方案涉及的内容.例如,为了寻找出最佳旅行路线,你的GPS会产生一个正确的解决方案.该方案可能是从你所在位置到目的地的所有可能路线中最快的路线,也可能是具有最短距离的路线,或者是能使你最快到达目的地同时也能免交过路费的路线.当然,你的GPS确定路线时所使用的信息可能不完全匹配实际情况.除非你的GPS能够获取实时路况信息,否则它可能假定穿过一条道路的时间等于道路的长度除以道路的限定时速. 然而,如果道路拥挤,当

c++求素数和的问题,求查问题

问题描述 c++求素数和的问题,求查问题 求素数和 描述 对于给定的一个正整数序列,求它包含的所有素数的和. 输入 输入的第一行是一个整数n,在区间[1,10000]之中.后面紧跟n行,每一行是一个整数,在区间[1,100]之中. 输出 对输入的n个正整数中所有的素数求和,并把和在一行中输出. 样例输入 5 8 2 3 7 10 样例输出 12 我写的代码,自己试是对的,但提交结果有错,不是为何 #include using namespace std; int main() { int n;