Project_Euler-07 题解

Project_Euler-07 题解

题目

思路

一个线性筛解决问题,当然也可以用埃式筛或者标准的暴力破解,这里选用最优秀的方式,顺便复习一下线性筛的内容:

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<time.h>

// 返回一个指向存放n个数之前所有素数的数组
int *__PrimeGet(int n) {
	// arr以下标为数字,作为标记数组,0表示质数,1表示合数
    int *arr = (int *)malloc(sizeof(int) * n);
    // prime存放已经被筛出来的素数
    int *prime = (int *)malloc(sizeof(int) * n);
    // 全部初始化为0
    memset(arr, 0, sizeof(int) * n);
    memset(prime, 0, sizeof(int) * n);
    
    // pos表示prime中最后一个素数后一个地址,从1开始存放
    int pos = 1;
    //遍历arr中所有元素,都判断一遍,i表示正在判断的数
    for (int i = 2; i <= n; i++) {
    	// 如果为素数,存放到prime数组中。
        if (!arr[i]) prime[pos++] = i;
        // 遍历已经筛出的素数
        for (int j = 1; j < pos; j++) {
        	// 如果当前判断值i与当前遍历到的素数乘积大于要求范围n,停止判断
            if (i * prime[j] > n) break;
            // 将当前遍历到的素数的i倍的数标记为1
            arr[i * prime[j]] = 1;
            // 当前判断值是第一个可以除掉j值对应素数的,说明prime[j]是该数的最小质因数
            if (i % prime[j] == 0) break;
        }
    }
    free(arr);
    return prime;
}


// 这个程序是用来输出n之前所有素数的程序,如果你想要知道第10001个质数是多少,
// 你可以将结果重定向到一个带行号的文本文件中,查看第10001行的值,就是答案。
int main(){
    int n;
    scanf("%d", &n);
    int *prime = __PrimeGet(n);
    for (int i = 1; prime[i]; i++) printf("%d\n", prime[i]);
    free(prime);
    return 0;
}
```
相关推荐
程序员老舅40 分钟前
C++音视频开发:基础面试题
c++·ffmpeg·音视频·视频编码·h264·音视频编解码·视频解码
码破苍穹ovo2 小时前
堆----1.数组中的第K个最大元素
java·数据结构·算法·排序算法
愤怒的小鸟~~~2 小时前
c语言创建的一个队列结构(含有这个头指针和这个尾指针的结构具有一定的参考价值)
c语言·开发语言·算法
Joker-01113 小时前
深入 Go 底层原理(十二):map 的实现与哈希冲突
算法·go·哈希算法·map
lifallen4 小时前
深入解析RocksDB的MVCC和LSM Tree level
大数据·数据结构·数据库·c++·lsm-tree·lsm tree
君鼎4 小时前
Effective C++ 条款18:让接口容易被正确使用,不易被误用
c++
whxnchy4 小时前
C++刷题 - 7.27
开发语言·c++
金融小师妹4 小时前
AI量化模型解析黄金3300关口博弈:市场聚焦“非农数据”的GRU-RNN混合架构推演
大数据·人工智能·算法
金融小师妹4 小时前
基于LSTM-GRU混合网络的动态解析:美联储维稳政策与黄金单日跌1.5%的非线性关联
大数据·人工智能·算法
白日梦想家-K5 小时前
题单【模拟与高精度】
开发语言·c++·算法