作业介绍

素数

// 质数判断法一 : 试除法

bool isPrime(int n){
	if(n<2) return 0;
	for(int i=2;i*i<=n;i++){
		if(n%i==0) return 0;
	}
	return 1;
}

最大公约数

int gcd(int a, int b){
	if(a%b==0) return b;
	return gcd(b, a%b);
}
#include <iostream>

using namespace std;

// 埃氏质数筛  1e7
// 所有质数的倍数都是合数(1倍除外)
const int MAX = 1e7 + 5;
// 标记合数
int pri[MAX]; // pri[i] = 0,说明i是质数

// 标记过程,搭配代码自己理解一下
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
//0 0 0 0 1 0 1 0 1 1  1  0  1  0  1  1  1  0  1  0  1

int main() {
    int n;
    cin>>n;
    // 1不是质数,标记为 1
    pri[1] = 1; 
    // 从2一直遍历到n
    for(int i=2;i<=n;i++){
        // 判断是不是质数
        if(pri[i] == 0){
            // 只标记当前质数i的倍数(从两倍开始)
            for(int j=i*2;j<=n;j+=i){
                pri[j] = 1; // 是合数,标记1
            }
        }
    }
    for(int i=2;i<=n;i++){
        if(pri[i] == 0) cout<<i<<" ";
    }
    return 0;
}
/*
  题目:洛谷P3383
*/
#include <iostream>

using namespace std;

// 欧拉筛(线性筛)  1e8
// 原理:所有质数的倍数都是合数(1倍除外)
// 优化:相比埃氏筛,欧拉筛减少了大量的重复计算,从而效率更高

const int MAX = 1e8 + 5;
// 标记合数
int pri[MAX]; // pri[i] = 0,说明i是质数
int p[MAX];  // 存储质数
int cnt = 0;

// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// 0 0 0 0 1 0 1 0 1 1  1  0  1  0  1  1  1  0  1  0  1
// 2 3 5 7 11
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	// 正常从2开始找质数,一直找到n
	for(int i=2;i<=n;i++){
		// 如果是质数,把质数i放到p数组里面
		if(pri[i] == 0) p[++cnt] = i; 
		// 遍历每一个质数,去标记每个质数的倍数
		// 注意结束条件,p[i]*i不能超过n (数组不能越界) 
		for(int j=1;j<=cnt && p[j]*i<=n;j++){
			// 标记合数
			pri[ p[j]*i ] = 1;
			// 如果当前的i能被质数整除就结束循环
			if(i%p[j] == 0) break;
		}
	}
	// 获取题目的每轮查询
//	while(m--){
//		int t;
//		scanf("%d",&t);
//		printf("%d\n", p[t]);
//	}
	return 0;
}
状态
已结束
题目
4
开始时间
2024-1-19 15:30
截止时间
2024-1-31 23:59
可延期
24 小时