博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言——筛法求100以内的素数
阅读量:2339 次
发布时间:2019-05-10

本文共 1635 字,大约阅读时间需要 5 分钟。

步骤简介

  • 初始化数组a,使得a[i] = i;
  • 对i = 2,3,4,…,sqrt(N)分别做:“筛掉a中所有的a[i]的倍数”
    • 对数组a中a[i]后面的所有的数a[j]分别做:若“a[j]是a[i]的倍数”,则"筛掉a[j]"
  • 输出数组中余下的a[i]!= 0的数

我的代码

#include 
#include
#include
int main(){
//筛法求100以内的素数 int a[100],i = 0,n = 100,edge,j; //初始化所有的数组元素 for(;i < 100;i ++) {
a[i] = i; } //做筛法的准备:求出对应的开方数,新得遍历倍数 edge = (int)sqrt(n); for(i = 2;i <= edge;i ++) {
for(j = 2;j < n / 2;j ++) {
if(j * i < n) {
a[j * i] = 0; } } } //输出所有的不为零的部分 for(i = 0;i < n;i ++) {
if(a[i] != 0) {
printf("%d \n",a[i]); } } return 0;}

教程代码

#include 
#include
#include
#define N 100void PrintPrime(int a[], int n);void SiftPrime(int a[], int n);int main(){
int a[N+1]; SiftPrime(a,N); PrintPrime(a,N); return 0;}void SiftPrime(int a[], int n){
int i ,j ,edge; for(i = 2; i <= N; i ++) {
a[i] = i; } edge = sqrt(N); for(i = 2;i <= edge;i ++) {
for(j = i + 1;j <= N;j ++) {
if(a[i] != 0 && a[j] != 0 && a[j] % a[i] == 0) {
a[j] = 0; } } }}void PrintPrime(int a[],int n){
int i ; for(i = 2;i <= N;i ++) {
if(a[i] != 0) {
printf("%d \t",a[i]); } } printf("\n");}

分析与总结

  • 判定是否是某数的倍数,不一定是乘法,也可以是除法。乘法需要考虑是否越界,但是除法只需要将剩下所有的逐一遍历即可
  • 大循环确定其为某个数的倍数,该数之前一定没有任何数的倍数,仅在其后才有相关的倍数。
  • 没有理清两个数的因数的关系,一定是一个大,一个数小,大的数一定小于N / 2,所以没有必要全部都遍历。

转载地址:http://iggpb.baihongyu.com/

你可能感兴趣的文章
leetcode 1.TwoSum--hashmap
查看>>
leetcode 14. Longest Common Prefix
查看>>
leetcode 26. Remove Duplicates from Sorted Array
查看>>
leetcode 27. Remove Element
查看>>
leetcode 66. Plus One
查看>>
leetcode 111. Minimum Depth of Binary Tree
查看>>
leetcode 257. Binary Tree Paths
查看>>
poj1611-并查集
查看>>
Trie树(字典树)
查看>>
大数运算-模拟
查看>>
腾讯2017暑假实习笔试题-字符串编码
查看>>
腾讯2017暑假笔试题-查找二叉树的根
查看>>
迭代器概念及traits编程技法.md
查看>>
Linux安装cmake
查看>>
SRS源码分析-协程相关类
查看>>
为何我看好社群直播
查看>>
为何我看好电商直播
查看>>
为何我看好老幼监控直播市场
查看>>
我为什么看好在线视频行业
查看>>
Xeon E3-1500 v5 GPU
查看>>