求质数-------2012年12月29日

简介:
       昨天太忙,没有时间做一个题,先记着,明天来补。
       问题描述很简单,就是求N之内的所有质数并且打印出来。
       思路:求质数有很多方法,我这里用一种比较高效的方法。我一步一步地说明方法。
      1.比如判断一个数num是否为质数,那么就用num去对"i(i从2开始)直到根号num"取模,如果都不能整除就说明num是质数。
      2.但是这样会有很多次多余的计算。从1到N,有很多数是可以直接被2,3整除了,那么,就需要去除掉能被2,3整除的数。在6个数里,6n+1,6n+2,6n+3,6n+4,6n+5,6n+6中,只有6n+1,6n+5需要被测试。
      3.进一步地,将取模的范围缩小为"从1到根号num"范围内的质数。
      代码如下:
     
 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 #define MAX 10000
 5 #define YES 1
 6 #define NO 0
 7 
 8 //prototype
 9 int judge(int judge_num);
10 
11 int prime[MAX]={2,3,5};
12 int N=100;
13 int count=3;
14 
15 int main()
16 {
17     int index=0;
18     int num;
19     for(index=1;index*6+5<=N;index++) //Just test 6*n+1,6*n+5
20     {
21         num=6*index+1;
22         if(judge(num)==YES) 
23             prime[count++]=num;
24         num=6*index+5;
25         if(judge(num)==YES) 
26             prime[count++]=num;
27     }
28     for(index=0;index<count;index++)
29         printf("%d ",prime[index]);
30     printf("\n");
31 }
32 
33 int judge(int judge_num)
34 {
35     int index=0; 
36     for(index=0;prime[index]*prime[index]<=judge_num;index++)
37     {
38         if((judge_num%prime[index])==0) 
39             return NO;
40     }
41     return YES;
42 }

 
相关文章
|
机器学习/深度学习 存储 算法
算法---------空间复杂度
算法---------空间复杂度
|
5月前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
8月前
|
算法 C语言
Leetcode----旋转数组 ------C语言篇
Leetcode----旋转数组 ------C语言篇
|
5月前
|
存储
LeetCode------斐波那契数列(2)
这篇文章提供了解决LeetCode上"斐波那契数列"问题的两种方法:一种是使用备忘录模式通过递归计算并存储结果以避免重复计算,另一种是自底向上的迭代方法,同时要求结果对1e9+7取模。
LeetCode------斐波那契数列(2)
|
5月前
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
7月前
|
C语言
C语言----寻找100~999范围内的质数--素数
C语言----寻找100~999范围内的质数--素数
|
8月前
题目----逆序
题目----逆序
29 0
|
8月前
|
算法 Java
算法-----全排列
算法-----全排列
|
机器学习/深度学习 存储 算法
算法------时间复杂度
算法------时间复杂度