首页 > 其他分享 >c语言欧拉筛法求素数 #欧拉筛法 #c语言

c语言欧拉筛法求素数 #欧拉筛法 #c语言

时间:2024-12-09 09:31:20浏览次数:6  
标签:10000 语言 筛法 int 筛出 合数 乘以 素数 欧拉

筛选一个小范围内的素数大家基本都会用遍历法,如筛选1~100的素数,大家可能会写出下面代码:

#include <stdio.h>
#include <math.h>

int main() {
    int num;
    for (num = 2; num <= 100; num++) {  // 遍历2到100的数
        int i;
        int is_prime = 1;  // 先假设是素数,标记为1
        for (i = 2; i <= sqrt(num); i++) {  // 从2到该数的平方根进行判断
            if (num % i == 0) {
                is_prime = 0;  // 如果能被整除,说明不是素数,标记为0
                break;
            }
        }
        if (is_prime == 1) {  // 根据标记判断是否为素数,若是则输出
            printf("%d ", num);
        }
    }
    return 0;
}

 但当我们求1~n,并且n 趋于无穷时,这个方法可能就会超时了,那有没有更高级的算法吗?

 当然有,欧拉筛法就是其中之一,但此算法过于复杂,下面我来为大家详细讲解一下。

      我们知道素数乘素数等于合数,所以我们可以用前面的素数相乘筛选出后面的合数,如图我们以2开始,2乘以2筛出4,

接下来用3乘以2筛出6,3乘以3筛出9,

接下来用4乘以2筛出8,  (合数乘以素数或者合数还是合数,于是当轮到合数只相乘到它的非1最小因子即停止)(例如4的因子有1,2,4.  6的因子有1,2,3,6,9的因子有1,3,9)

接下来用5乘以2筛出10,5乘以3筛出15,5乘以5筛出25,

依次推下去,没筛出的即为素数。

  于是我们可以设数组a[10000]为 初始数组,数字is_prime[10000]为素数数组

#include<stdio.h>
#define N 10000
int main()
{
	int i, j=0, k;
	int a[N] = { 0 }, is_prime[N] = { 0 };   //令数组初始化为 0,i为合数时,令a[i]=1
	for (i = 2; i <= N; i++) {             
		if (a[i] == 0) is_prime[j++] = i;    //当a[i]不为零时,将i保存到is_prime数组中
		for (k = 0; is_prime[k] <= N && i * is_prime[k] <= N; k++) {
			a[i * is_prime[k]] = 1;      //用前面的素筛出后面的合数
			if (i % is_prime[k] == 0) break;    //合数筛选停止条件,这步比较难理解
		}
	}
	for (i = 0; i < j; i++) {
		printf("is_prime[%d]=%d\n", i, is_prime[i]);
	}
	return 0;
}

最后打印结果如下:

最后麻烦各位大佬们留下手中三连,嘻嘻!!

标签:10000,语言,筛法,int,筛出,合数,乘以,素数,欧拉
From: https://blog.csdn.net/2401_87133003/article/details/144252766

相关文章

  • python语言tppccx代码
    importrequestsimportosimportreurl=‘https://www.quazero.com/a/youmeifengjing/1530_%d.html’header={‘user-agent’:‘Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/131.0.0.0Safari/537.36Edg/131.0.0.0......
  • python语言dypccx代码
    importrequestsurl=‘https://v3-web.douyinvod.com/c379fe76bf354559f7005c9425e2e686/6753c902/video/tos/cn/tos-cn-ve-15/oghhe8A22ITWqDuNAUC6ROgFeIBpfCBE2G37GL/?a=6383&ch=11&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=895&bt=8......
  • 初探C语言|实现井字棋游戏:二维数组妙用
    文章目录前言正文**1.游戏基本规则****2.代码结构和实现****2.1初始化棋盘****2.2打印棋盘****2.3玩家和电脑的回合****2.4判断胜利或平局****2.5游戏主循环****2.6游戏菜单**总结与优化欢迎讨论:如有错误或不足,欢迎指正和建议,本人主打“听劝”。当然,如有疑......
  • 使用 Io 语言实现简单的图像处理
    什么是Io语言?Io是一种轻量级、面向对象且动态的编程语言,设计灵感来源于Smalltalk、Lisp和Lua。它以其简洁的语法和强大的元编程能力著称,非常适合快速实现概念验证或进行脚本编写。在本篇文章中,我们将使用Io编写一个简单的灰度图像反转(取反)处理程序。代码实现:灰度图像反......
  • 使用 Crystal 语言实现基本图像处理
    什么是Crystal语言?Crystal是一种静态类型、编译型的编程语言,兼具高性能和简洁的语法。它的语法类似Ruby,但比Ruby更加高效,适合用于性能要求较高的应用程序。Crystal的设计目标之一是提供尽可能少的开销,以确保程序的快速执行。在本篇文章中,我们将使用Crystal编写一个简单......
  • C语言实现三子棋
    //主函数#include"game.h"intmain(){ intinput=0; srand(time(NULL));//利用时间戳生成随机数 do{ menu();//打印菜单 scanf("%d",&input);//输入1开始游戏,0退出游戏 if(input) game(); else{ printf("退出游戏\n"); break; }......
  • 数组练习题14道【C语言】
    一维数组1键盘录入一组数列,利用冒泡排序将数据由大到小排序/*************************************************************************>FileName:work11.c>Author:sgc>Description:键盘录入一组数列,利用冒泡排序将数据由大到小排序>Cre......
  • 10_C语言 -数组(常规)
    数组引例如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,如:intscore。假如我们要在程序中表示一组成绩,此时我们所学的常规数据类型就无法再表示,这个时候我们就需要使用到一种新的表现形式,这种表现形式就是我们的数组。什么是数组数组是相同类型,有序数据......
  • 实验5_C语言指针应用编程
    任务1_1#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);input......
  • PLC编程—编程语言
    LAD:图形编程语言(电路图表示法——梯形图)。FBD:图形编程语言(电路系统表示法——功能块图)。SCL:结构化编程语言之一。STL:文本编程语言。常用的指令位、定时、计数、比较、数学、赋值、转换、字逻辑、移位、其他STL:文本编程语言常用的指令:位:A:"与”运算——A(...)AN:"与”......