开云体育登录入口(中国)手机版下载v2.6 - ios/安卓/手机APP下载

日期:2017-07-03 10:55:48 人气:1

开云体育登录入口(中国)手机版下载v2.6 - ios/安卓/手机APP下载

开云体育游戏介绍,开云体育app下载免费安装,开云体育官方网站下载,开云体育官网手机版入口最新网址【解题思路】本题的重点在如何判断一个数是否素数。判断素数的唯一标准就是能不能被除了1和本身之外的其它数整除,可以通过循环来判断,比如要判断27是否素数,可以用一个循环,从2开始到26逐个检测,看27能否被其中某个数整除,如果能就不是素数,否则就是素数。判断一个数是否被另一个数整除可以用取余运算符%,比如:a%b==0(就是a除以b的余数等于0),就可以判定a可以被b整除。针对本题,为了使代码更简洁,可以专门写个判断一个数是否素数的函数,然后在主函数中调用就可以很容易实现求任意两个数之间的所有素数的要求。具
    A+
热门评论

求任意两数之间素数个数(尽可能是时间最小且用C或C++),O(∩_∩)O谢谢~~

首先,你说尽可能时间最小,那么我就认为你的空间复杂度无所谓乱了:D 因此用下面的算法: 1,先说说算法原理 (1)定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个"素数"因子d. (2)素数定理: ln(x)-3/2 = 67时.,其中PI(x)为x范围你素数的个数, ,由(1)有,2^32范围内的素数判断需要判断PI(2^16)个素数即可 由(2),可以估算2^16范围类的素数个数即PI(2^16) 大致为6138-6834个,实测为6542个。 因此,要求时间尽可能小,如下: 定义常量数组,2^16内所有素数,可以编程产生输出到文件,再拷进程序,因为这段为常量,时间复杂度为O(1)....hoho const static int primes[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103, 107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211, 223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331, 337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449, 457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587, 593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709, 719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853, 857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991, ... 65521, 65537 }; 或者你不想弄这个常量数组,那么用下面的产生primes数组 // 构造素数序列primes[] 其中的num=2^16,这个也是程序开始一次运行即可,时间复杂度可认为是常数 void makePrimes(int primes[], int num) { int i, j, cnt; primes[0] = 2; primes[1] = 3; for(i = 5, cnt = 2; cnt < num; i += 2) { int flag = true; for(j = 1; primes[j]*primes[j] <= i; ++j) { if(i%primes[j] == 0) { flag = false; break; } } if(flag) primes[cnt++] = i; } } //判断是否素数用如下算法,原理是利用定理(1) //其中primes[]即上面定义的常量数组,这个算法时间复杂度为O(PI(sqrt(n))),其中PI上面说了 bool isPrime(const int primes[], int n) { if(n < 2) return false; for(int i = 0; primes[i]*primes[i] <= n; ++i) if(n%primes[i] == 0) return false; return true; } 最后的[a,b]范围内的素数个数就不用详述了吧?一个循环,每个用isPrime判断而已。

阅读全文