判断素数

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

╄→г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 ,

ZQOJ 1092: 素数表(函数专题)

你离开我真会死。 提交于 2020-01-20 12:39:13
题目描述 输入两个正整数m和n,输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 } 对于C/C++代码的提交,本题要求必须通过定义prime函数和main函数实现,否则,提交编译错误,要提交完整的程序。 输入 输入两个正整数m和n,m<=n,且都在int范围内。 输出 输出占一行。输出m和n之间的所有素数,每个数后有一个空格。测试数据保证m到n之间一定有素数。 样例输入 2 6 样例输出 2 3 5 #include<stdio.h> #include<math.h> int prime(int n) { int k; int i; if (n == 1) { return 0; } k = (int)sqrt(n); for (i = 2; i <= k; i++) { if(n % i == 0) { return 0; } } return 1; } int main() { int m, n; int a; scanf("%d%d", &m, &n); for (int i = m; i <= n; i++) { a = prime(i); if (a ==

调素数

余生颓废 提交于 2020-01-20 01:56:49
题意:从一个含有n个元素的数组中挑选出k个相加,看结果是否为素数。计算其中素数个数。 思路:递归表示全排列。 # include <iostream> # include <math.h> using namespace std ; int x [ 20 ] , n , k ; //依照题目所设 bool isprime ( int n ) { //判断是否质数 int s = sqrt ( double ( n ) ) ; for ( int i = 2 ; i <= s ; i ++ ) { if ( n % i == 0 ) return false ; } return true ; } int rule ( int choose_left_num , int already_sum , int start , int end ) { //choose_left_num为剩余的k,already_sum为前面累加的和,start和end为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可 if ( choose_left_num == 0 ) return isprime ( already_sum ) ; int sum = 0 ; for ( int i = start ; i <= end

Python求解素数问题

怎甘沉沦 提交于 2020-01-19 22:21:27
Python求解素数问题 author: Starry锐 问题描述: 之前看到一道与素数有关的编程题,我一开始把问题分解为 定义一个函数 def is_prime(n): 判断素数并将素数存入list 用一个for循环对符合条件的素数对进行计数 下面说说我是咋想的,一开始我想面向百度编程,直接从网上找现成的判断素数函数,完成第一步。后来找了找发现,好几个网上的函数都有问题,调了半天发现要不是 error 要不就会把一些不是素数的数也放进来。 想了想还是自己写吧 于是。。。我上网复习了一下素数的概念。。。(对不起我菜) 这里用我自己的话来说一下 素数就是除了1和它本身,不能被其他数整除的数 给出我写的判断素数的函数 def is_prime ( n ) : p = [ 2 , ] #这里要初始化p,由于下边的循环无法将n=2的情况判断为素数,故先加上 if n <= 1 : p = p for i in range ( 2 , n ) : #这里无法判断n=2时是素数,因为range(2,2)无法迭代 for j in range ( 2 , i ) : #j的范围2到i-1 if i % j == 0 : break #break后边不加; if j == i - 1 : #什么原理?? #如果j迭代到i-1,即j从2到i-1都无法满足i%j==0,说明i是素数 p .

C-歌德巴赫猜想的证明 SDUT

半世苍凉 提交于 2020-01-18 02:47:09
Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 验证“每个不小于6的偶数都是两个素数之和”,输入一个不小于6的偶数n,找出两个素数,使它们的和为n。 Input 输入一个不小于6的偶数n。 Output 找出两个素数,使它们的和为n。只需要输出其中第一个素数最小的一组数据即可。 Sample Input 80 Sample Output 80=7+73 Hint Source # include <stdio.h> # include <stdlib.h> int f ( int n ) { int i , j ; for ( i = 2 ; i < n ; i ++ ) { for ( j = 2 ; j < i ; j ++ ) //for循环为一个判断素数过程 { if ( i % j == 0 ) break ; } if ( j == i ) //如果“i”是素数,继续执行下面语句判断n-i是否为素数 { for ( j = 2 ; j < n - i ; j ++ ) { if ( ( n - i ) % j == 0 ) break ; } if ( j == n - i ) //如果n-i也为素数,则返回i的值,返回值后函数便结束继续执行; return i ; } } } int

50道经典的java程序题

好久不见. 提交于 2020-01-18 00:06:35
JAVA基础编程练习50题 本文对50道经典的java程序题进行详细解说,对于初学者可以跳过一些逻辑性太强的题目,比如第一题用到了方法的递归,初学者可能不理解,最好先看那些有if、for、while可以简单解决的程序题!但是,对于比较深入学习过的同学,还是希望可以一口气就看完,这是比较全面思维锻炼! 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…. 做这种题目,最好的做法就是找出规律,跟高中的数列一样 本题有:a[n]=a[n-1]+a[n-1],而第一第二项都知道了,后面的值也可以求得 public class Programme1 { public static void main(String[] args) { System.out.print("请输入你想知道的兔子数量的月份:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt();//获取输入的整数 System.out.println("第" + n + "个月兔子总数为" + fun(n)); scanner.close(); } /** *

P1217 [USACO1.5]回文质数 Prime Palindromes

点点圈 提交于 2020-01-16 19:42:30
题目链接 先找出所有的回文数,然后再判断是否为素数。直接判断的话最后一个测数会TEL 通过查找百度百科了解回文素数的知识,两位回文素数1个,三位回文素数15个,五位回文素数93个,七位回文素数668个,九位回文素数5172个。从而可以删除大量的无用数据,我的代码只删除了8位的数据就AC了,没有用打表的方法删除更多的无用数据。 AC代码 # include <bits/stdc++.h> using namespace std ; int temp [ 10000000 ] , num ; void check ( int a ) { if ( a % 6 != 1 && a % 6 != 5 ) { return ; } for ( int i = 5 ; i <= sqrt ( a ) ; i + = 6 ) { if ( a % i == 0 || a % ( i + 2 ) == 0 ) { return ; } } printf ( "%d\n" , a ) ; } void Palindrome ( int x ) { int n = x , newed = 0 ; do { newed = newed * 10 + x % 10 ; x / = 10 ; } while ( x > 0 ) ; if ( n == newed ) { check ( n ) ; } }

Miller_Rabin素数测试【学习笔记】

与世无争的帅哥 提交于 2020-01-15 06:32:39
引语: 在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法)。但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用。所以我们需要学习 Miller_Rabin 算法。 知识准备 + 算法推导: 1.威尔逊定理:若p是素数,则 ( p -1) !≡ -1( mod p ) . 2.有趣的是,威尔逊定理的逆命题也是正确的:设n是正整数且 n ≥ 2 ,若 ( n -1) !≡ -1( mod n ) ,则 n 是素数. 很多朋友可能在学习的时候会碰到威尔逊定理,它主要是告诉我们,它的逆定理给出了一种素性检验的方法(其实用的少,原因在后),遗憾的是,这不是一个实用的检验法,因为这需要进行 ( n -2) 次模n的乘法运算才能得到 ( n -1)! 模 n 的值,运算量达到了 O( n(log 2 n) 2 ) 次位运算。 行吧,那我们只能另谋出路了。 3.费马小定理:设 p 是一个素数, a 是一个正整数且 p 不整除 a ,则 a p- 1 ≡ 1( mod p ) . 4.伪素数:令 b 是一个正整数. 若 n 是一个正合数且 b n ≡ b ( mod n ) ,则称 n 为以 b 为基的伪素数(有时也称费马伪素数)。(唉~,这是虚伪的素数,它爱着费马测试,却是合数)。 辣个男人,它来了! 那么基于费马小定理

如何构造素数表

て烟熏妆下的殇ゞ 提交于 2020-01-15 02:29:22
构造素数表 欲构造n以内不含n的素数表 1.开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数 2.令x等于2 3.如果x是素数,则对于(i=2;x*i<n;i=i+1)令prime[i*x]=0 4.令x=x+1,如果x<n,重复3,否则结束 # include <stdio.h> int main() { const int maxnumber=25; /*const定义常量,但是这样的话就没法从下面用scanf_s输入改变的maxnumber*/ int i, x; int isprime[maxnumber]; /*只能用const定义,否则[]就会出现error,所以很矛盾*/ for (i = 0; i < maxnumber; i = i + 1) { isprime[i] = 1; /*将所有的都变成1*/ } for (x = 2; x < maxnumber; x = x + 1) /*把2i去掉,把3i去掉,把4i去掉...........把ni去掉*/ { if (isprime[x]) /*其实有没有这个if都行,这个减少了for循环的次数,优化了程序 不过确实大大的减少了程序运行的次数,尤其是数越大越明显*/ { for (i = 2; i *x< maxnumber; i = i + 1) { isprime[i * x] =

C 求某个范围的所有素数 SDUT

青春壹個敷衍的年華 提交于 2020-01-15 02:00:46
Description 求小于n的所有素数,按照每行10个显示出来。 Input 输入整数n(n<10000)。 Output 每行10个依次输出n以内(不包括n)的所有素数。如果一行有10个素数,每个素数后面都有一个空格,包括每行最后一个素数。 Sample Input 100 Output 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 Hint 请注意题目中求的是小于n的所有素数。 # include <stdio.h> # include <stdlib.h> int main ( ) { int n , i , j ; int count = 0 ; scanf ( "%d" , & n ) ; for ( i = 2 ; i < n ; i ++ ) //for循环控制范围; { for ( j = 2 ; j < i ; j ++ ) //一个判断素数过程; { if ( i % j == 0 ) break ; } if ( i == j ) { printf ( "%d " , j ) ; //每一个数后面都有空格; count ++ ; } if ( count % 10 == 0 ) printf ( "\n" ) ; } return 0 ; } 来源: CSDN