|
板凳
楼主 |
发表于 2013-11-4 02:11:05
|
只看该作者
上面的做法仍然有改进空间,例如把质数表的搜索改成2分搜索;线性搜索最坏要25次,而二分搜索只要5次就可以了。
另外试除到n/2是比较慢的做法,筛质数可以参考 http://bbs.ahalei.com/thread-2961-1-2.html
但是100以内的数字实在太少,改进也难以察觉效果
不过最后还是写一个我自己比较满意的版本- #include <stdio.h>
- void init(void);
- int is_prime(int);
- int prime_table[50];
- int prime_num = 0;
- int main(void)
- {
- int i, j;
- init();
- for(i=4; i!=100+2; i+=2){
- int upper = i / 2;
- printf("%d", i);
- for(j=2; j <= upper; ++j)
- if(is_prime(j) && is_prime(i-j))
- printf("=%d+%d", j, i-j);
- puts("");
- }
- return 0;
- }
- void init()
- {
- int i, j;
- int pos = 0;
- int div[] = {2, 3, 5, 7};
- /* 筛法,将100以内的整数用2,3,5,7筛一遍,剩下的就是质数 */
- int buf[101] = {1, 1, 0};
- for(i=0; i!=4; ++i){
- int d = div[i];
- buf[d] = 1;
- for(j=d*d; j<101; j+=d)
- buf[j] = 1;
- }
- for(i=0; i!=4; ++i)
- prime_table[pos++] = div[i];
- for(i=3; i<101; i+=2)
- if(buf[i] == 0){
- prime_table[pos++] = i;
- prime_num += 1;
- }
- prime_num += 4;
- }
- int is_prime(int n)
- {
- /* 二分搜索 */
- int upper = prime_num-1;
- int lower = 0;
- while(upper >= lower){
- int mid = (upper + lower) / 2;
- if(prime_table[mid] > n)
- upper = mid - 1;
- else if(prime_table[mid] < n)
- lower = mid + 1;
- else
- return 1;
- }
- return 0;
- }
复制代码 |
|