发表时间:2011-04-11
import java.util.ArrayList; import java.util.List; public class Prime { private List<Integer> primes = new ArrayList<Integer>(); private int maxPrime = 3; private static Prime instance = new Prime(); /** * Singleton. */ private Prime() { primes.add(2); primes.add(3); } private void addPrime (int integer) { if (integer <= maxPrime) { // All primes already found. return; } for (int prime : primes) { // Search for greater prime. if (integer % prime == 0) { return; } } primes.add(integer); // Found greater prime. maxPrime = integer; // Set the greatest prime. } public static void printPrimes(int topInt) { if (topInt > instance.maxPrime) { // Still primes not found. for (int i = instance.maxPrime + 2; i <= topInt; i+= 2) { instance.addPrime(i); } } for (int prime : instance.primes) { if (topInt < prime) { // Just print to the input integer. break; } System.out.println(prime); } } public static void main(String[] args) { Prime.printPrimes(100); } } |
|
发表时间:2011-04-12
毕业2年就已经忘记了什么是素数的在javaeye什么水平?
|
|
发表时间:2011-04-12
这个问题,在大一学的c语言(就是谭浩强那本书)的时候,就已经知道了,至于那个效率问题,我的确已经忘记了。
|
|
发表时间:2011-04-12
很明显LZ 想证明自己是圣人。。。
|
|
发表时间:2011-04-12
kdlan 写道 感觉LZ的方法还是慢
最快的还是占用大量内存空间筛数 根据已经筛出的素数进行再筛选 步长为每相邻两个素数的差值,也就是每次都会变 这个比固定步长肯定要快 这个应该比模6,模30快些 每产生一个素数,则辐射后面n个该素数步长的数,打标 遇到第一个没覆盖打标的点即为新素数,这是i*j ++递增的优选法,避免了模6,模30的被动匹配,模30只是剔除了,2,3,5的合数空间,7,11...后面的合数(无2,3,5因子)都需要数次% |
|
发表时间:2011-04-12
求100内的质数何必那么麻烦:
for (int i = 2; i < 100; i++) { if(i==2||i==3||i==5||i==7){ System.out.println(i+"\t"); } if (i % 2 == 0) { continue; } else if (i % 3 == 0) { continue; } else if (i % 5 == 0) { continue; } else if(i % 7==0){ continue; } else{ System.out.println(i+"\t"); } } 不过一个常写Web程序的一下子想不起来并不奇怪。尺有所短,存有所长。 |
|
发表时间:2011-04-12
这个并不能证明国内程序员的水平。别人一天到晚给外包做项目哪有时间整这些玩意。
|
|
发表时间:2011-04-12
long start = System.currentTimeMillis(); int[] nums = new int[1000000]; for(int i = 2; i <= nums.length/2; i ++){ for(int j = 2; j * i < nums.length; j ++){ nums[i * j] = 1; } } for(int i = 0; i < nums.length; i ++){ if(nums[i] == 0) System.out.print(i + ","); } long end = System.currentTimeMillis(); System.out.println("\ntime:" + (end-start) + "ms"); 貌似这样也可以做,因为j从2开始,所以i可以只到一半就可以了是吧? 这里花的时间几乎90%都在打印这个数出来了。真正筛选的时间貌似是很少(如果这算法正确的话) 我测试了一下结果好像是对的,但不知道怎么评价呀。 确实是长久都没接触,忘得差不多了。 |
|
发表时间:2011-04-12
当年高中数学130的的路过,发现自己完全忘记质数的定义以及怎么求质数了
稍稍看了下,终于记起判断的方法是该数字只要不被1到这个数字平方根以内的其它质数整除就是了,前面的都是到一半,没必要了吧 看来平常还是得看看各种算法的东西,感觉思维都僵硬了 |
|
发表时间:2011-04-12
kimmking 写道 lzyzizi 写道 引用 ......n>=i*i 比i<=sqrt(n) 表示不懂。。。
用费马小定理+去除马歇尔数 测试过的数,可否100%可以通过? 不能~举个范例 341 过得了费马,不是卡米歇尔数,但是他不是质数。 341 是卡米歇尔数 问题是如何判断是卡米歇尔数,使用其他测试方法,还是有漏掉的。。。 第一个卡米歇尔数是561~~~ 对于341,我举出一个反例 6**340 % 341 = 56. gcd(6,341)=1 一些卡米歇尔数参考: http://oeis.org/A002997 |