最大素数

[蓝桥杯][算法提高]素数求和

╄→гoц情女王★ 提交于 2020-01-20 18:26:28
问题描述 Description 输入一个自然数n,求小于等于n的素数之和 Input 一个自然数n (2 ≤ n ≤ 2,000,000) Output 输出小于等于n的素数之和 Sample Input 2 Sample Output 2 问题思路 简单版[超时] 首先先判断这个数是不是质数,如果是质数就加上 中等版[通过] 题目中需要判断的范围最大是:2000000,所以,我们可以先使用暴力法,算出前 n \sqrt{n} n ​ 前个质数来,所有在判断质数的时候,我们进行模运算的范围是: 2- n \sqrt{n} n ​ 之间的质数就可以了。 代码实现 # include <iostream> # include <cmath> using namespace std ; //sqrt(n)以内的素数 int prime100 [ ] = { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 10 , 11 , 13 , 14 , 16 , 17 , 19 , 20 , 22 , 23 , 26 , 28 , 29 , 31 , 32 , 34 , 37 , 38 , 41 , 43 , 44 , 46 , 47 , 52 , 53 , 58 , 59 , 61 , 62 , 64 , 67 , 68 , 71 , 73 , 74 , 76 , 79 , 82 ,

最大素因子

喜你入骨 提交于 2020-01-10 05:21:38
题解报告:NYOJ 520 最大素因子 描述 GreyAnts最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数,例如:2的序数是1,3的序数是2,5的序数是3,以此类推. 研究数论是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0. 输入 有多组测试数据,每一行输入一个数字n.(0<n<=1000000) 输出 在接下来的一行,输出结果. 样例输入 2 3 4 5 样例输出 1 2 1 3 解题思路:任何一个不小于2的正整数都可表示成若干个素数乘积的形式,因此通过枚举素数的倍数,即可求出每个数的最大素因子在素数表中排第几,简单打个表,时间复杂度大概为O(nlogn),约等于1.38e07。 AC代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+5; 4 int n,pos[maxn]; 5 void init(){ 6 memset(pos,0,sizeof(pos)); 7 for(int i=2,cnt=0;i<maxn;++i){//从2开始 8 if(!pos[i]){//如果i是素数 9 cnt++; 10 for(int j=i;j<maxn;j+=i)//填充素数i的倍数的序号

筛选法求素数

ε祈祈猫儿з 提交于 2020-01-08 23:34:55
  求素数的程序是笔试或面试中会经常被问到的题目,大四找工作面试时,就被一个面试官问到了,虽然写出的代码能够完成题目要求,但是面试官并不满意,原因当然在程序的效率上,面试官反复问及如何对原有程序进行优化,想了半天除了将偶数剔除,再无其他想法,这也导致最后投递的岗位从研发变成offer中的测试。   素数的定义为,一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。对计算机专业的毕业生来说,这道题并不陌生,比如求N以内的所有素数,通常的解法为: 1 void PrimeNum(int n) 2 { 3 bool *bIsPrime = new bool[n+1]; //申请n+1来表示从1到n 4 for(int i=0; i!=n+1; i++) 5 if(i%2 == 0) 6 bIsPrime[i] = false; 7 else 8 bIsPrime[i] = true; 9 10 bIsPrime[2] = true; //2为素数 11 12 int j, k, nSqrt; 13 for(j=3; j<=n; j+=2) 14 { 15 nSqrt = sqrt(j); 16 for(k=3; k<=nSqrt; k++) 17 if(j%k == 0) 18 { 19 bIsPrime[j] = false;

Problem 3, Project Euler

徘徊边缘 提交于 2020-01-08 07:24:29
for loop can be effective in matlab when the loop number is small. it will be time consuming greatly when the loop number are large. for example in this problem, it ask us to look for the max prime number in range(1, 600851475143). Matlab: 1: the hard way. clear clc suhsu = []; for i = 1:600851475143, m = []; for j = 1:i, m(j) = mod(i,j); end if(length(find(m == 0)) == 2) sushu = [suhsu i] end end 2: the Sieve of Eratosthenes hereafter cites from wiki: 给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。 给出要筛数值的范围n,找出 以内的素数 。先用2去筛,即把2留下

LeetCode:Count Primes

寵の児 提交于 2020-01-08 05:04:03
Problem: Description: Count the number of prime numbers less than a non-negative number, n . Credits: Special thanks to @mithmatt for adding this problem and creating all test cases. Solution:采用的为埃拉托斯特尼筛法 算法描述:(来自百度百科) 要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。 给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的吧倍数剔除掉;不断重复下去......。 步骤 详细列出算法如下: 列出2以后的所有序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 标出序列中的第一个素数,也就是2,序列变成: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 将剩下序列中,划掉2的倍数,序列变成: 2 3 5 7 9 11 13 15 17 19 21 23 25

204. Count Primes 素数的个数

旧巷老猫 提交于 2020-01-08 03:13:08
Description: Count the number of prime numbers less than a non-negative number, n . 求0-n的素数个数,使用埃拉托斯特尼筛法 要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。 给出要筛 数值 的范围n,找出以内的 素数 。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个 质数 ,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的 倍数 剔除掉;不断重复下去......。 步骤 详细列出算法如下: 列出2以后的所有序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 标出序列中的第一个素数,也就是2,序列变成: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 将剩下序列中,划掉2的倍数,序列变成: 2 3 5 7 9 11 13 15 17 19 21 23 25 如果现在这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。 本例中,因为25大于2的平方,我们返回第二步: 剩下的序列中第一个素数是3,将主序列中3的倍数划掉

求解素数环问题

匆匆过客 提交于 2020-01-06 01:23:08
素数:   质数(prime number)又称素数,有无限个。一个大于1的 自然数 ,除了1和它本身外,不能被其他自然数 整除 (除0以外)的数称之为素数(质数);否则称为 合数 。根据 算术基本定理 ,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。 素数环:   将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 使用顺序表和顺序队列来解素数环问题: package com.clarck.datastructure.queue; import com.clarck.datastructure.linear.SeqList; /** * 求解素数环问题 * * @author clarck * */ public class PrimeRing { /** * 求1~n素数环 * * @param n */ public PrimeRing(int n) { // 创建一个顺序表存储素数环 SeqList<Integer> ring = new SeqList<Integer>(n); // 1添加到素数环中 ring.append(new Integer(1)); // 创建一个队列que SeqQueue<Integer>

java02实验:方法

☆樱花仙子☆ 提交于 2019-12-27 01:00:24
一:素数输出 1. 实验要求: (1)编写判断该数是否为素数的方法,并在主方法中对其进行调用。 (2)注意编程规范:程序开头部分的目的,作者以及日期;必要的空格与缩进,适当的注释等; (3)实验报告中要求包括程序设计思想、程序流程图、源代码、运行结果截图、编译错误分析等内容。 2. 实验内容 (1)计算并输出3~100之间的素数。 (2)编程满足下列要求: 1)按照每行5个输出; 2)输出任意两个整数之间的所有素数; 3)输入两个整数,输出这两个整数之间的最大的10个和最小的10个素数 3.程序设计思想: 首先要了解素数的定义在大于1的自然数中,不存在除了1和它本身的因数。了解定义后,就知道要用循环语句依次求余来判断。我采用在类外定义一个只有一个参数的函数,来实现判断这个参数是否为素数。任意两个整数之间的素数输出,我用for语句将他们分别定义为初始条件和结束条件,然后又定义了一个计数器,实现每行五个输出,最后的最大和最小素数,只用了一个动态数组Arraylist,正反输出就解决了 4.源代码: 1 package java课堂; 2 3 /*20173442 信1705-3 田昕可*/ 4 5 import java.util.*; 6 7 public class Zuoye2 { 8 9 10 11 12 13 public static void main(String[]

python3之1007.素数对猜想 (20分)

不想你离开。 提交于 2019-12-06 23:31:17
题目赘述如下: 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10^5),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 题目解析: 题目仍然是不难理解,也不难写,素数的判断是编程基本功,然后判断i和i+2是否是素数对。 本题争议最大的地方乃最后一个测试点,暴力求解往往超时,需要简要优化算法,如下代码测试最后一个测试点用时222ms,效果还不错,可堪重用。 import math def sushu(num): # 判断素数的函数,注意传入的num已经全是奇数了,故从3开始判断每个奇数是否是因数 for i in range(3,int(math.sqrt(num))+1,2): if num % i == 0: return False return True if __name__ == '__main__': n = int(input()) con = 0 # 素数对计数 f1 = sushu(3) # f1和f2存入相邻两个数字的素数状态

C语言I博客作业11

强颜欢笑 提交于 2019-12-06 16:34:52
问题 回答 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/10096 我在这个课程的目标是 掌握并熟悉C语言的运用 这个作业在哪个具体方面帮助我实现目标 嵌套循环的运用 参考文献 《C primer Plus》《C语言程序设计》《CSDN》《百度》 1. PTA实验作业 1.1 输出三角形字符阵列 题目内容 本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。 输入格式: 输入在一行中给出一个正整数n(1≤n<7)。 输出格式: 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。 1.1.1 数据处理 数据表达:定义整型变量n,b,c,字符型变量a='A',其中n表示行数,b,c表示循环变量,a表示每列每行的字母 数据处理:输入n表示有n行数,从第一行n列开始,每下一行依次递减直到最后n行只有一列,用两个for循环,第一个for循环得出行数,第二个for循环得出列数,从字母A开始一个一个的输出,列循环累加时,字符型变量字母累加然后输出,每一行输完跳出中间第二个for循环,以换行跳回第一个for循环 伪代码: 1.1.2 实验代码截图 1.1.3 造测试数据 输入数据 输出数据 说明 4 A B C D