判断素数

求解素数环问题

匆匆过客 提交于 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>

Java打印素数(质数)

我只是一个虾纸丫 提交于 2020-01-06 01:19:21
要求:打印 2 - 100000 当中的素数与非素数。(素数定义:在大于1的自然数中,除了1和它本身以外不再有其他因数) 1. 常规方式——对正整数n,如果用2到 之间的所有整数去除,均无法整除,则n为质数: // sqrt 法 public static void printPrime1(int num) { boolean[] isPrimes = new boolean[num + 1]; for (int i = 2; i < isPrimes.length; i++) { isPrimes[i] = true; } for (int i = 3; i <= num; i++) { for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { isPrimes[i] = false; break; } } } System.out.print("质数有: "); for (int i = 2; i < isPrimes.length; i++) { if (isPrimes[i]) { System.out.print(i + " "); } } System.out.println(""); System.out.print("非质数有: "); for (int i = 2; i < isPrimes

7.8 月赛补题+cf 569div2

人走茶凉 提交于 2020-01-06 01:17:06
B(暴力 Q:统计两个正整数t1 、 t2 之间的所有数的约数个数和S,给出的两个数t1、t2为10000000以内的正整数。 A:暴力,在1到t2之间枚举因子r ,t2/r-t1/r 即t1~t2之间包含该因子的数的个数 ,求和即t 1 、 t2 之间的所有数的约数个数和 C(贪心,中位数 Q:http://47.96.116.66/problem.php?cid=1385&pid=2 A:关于改变中位数为目标值的贪心,修改次数最小的最优方案是 目标值大于当前中位数时,改变任意小于目标值的数为目标值; 目标值小于当前中位数时,改变任意大于目标值的数为目标值; 直到中位数改变 D(欧拉函数 从原点选择任意方向射线,对于给定c,问在(x,y)(|x| <= N , |y| <= N)范围内有多少方向恰好有c个整点; 1.由于对称性,只考虑 区域d:x〉=0 ,y〈=x 即可; 2.对于每一区域,任意一点(x,y)与原点连线所经整点数目为:min(n/(x/gcd),n/(y/gcd))在区域d内有 y〈=x, min(n/(x/gcd),n/(y/gcd)) 可化简为 n/(y/gcd) ; 3.由于 (y/gcd)与 (x/gcd)互质,对于满足 n/(x/gcd)= =c的x/gcd,所有比其小的与其互质的数可作为 (y/gcd)的取值。可满足的方案数即x/gcd的欧拉函数phi

【快速幂 && 素数筛 && 数论】Carmichael Numbers

倾然丶 夕夏残阳落幕 提交于 2020-01-06 01:15:52
Step1 Problem 原题 一个非素数n,如果对于任意2<=a<=n-1的a都有a^n mod n =a,则称n是一个卡迈克尔数,给出一整数n,判断其是否是卡迈克尔数 Step2 Ideas: 首先判断n是不是素数,不是素数直接枚举a快速幂算出a^n是否等于a即可,时间复杂度O(nlogn),包含两种求快速幂的方法,递归和循环 Step3 Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <map> #include <vector> #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; using namespace std; const int maxn = 650005; bool vis[maxn]; void prime() { mem(vis, true); for(int i = 2; i*2 <= maxn; i++) { if(vis[i]) { for(int j=i+i; j<=maxn; j+=i) vis[j] = false; } } } ll quick_mod(ll a,ll

[转载]判断一个数是否为素数

我只是一个虾纸丫 提交于 2020-01-06 01:10:20
来源: https://blog.csdn.net/afei__/article/details/80638460 一、概念介绍 质数的定义 是 :在大于1的自然数中,除了1和它本身以外不再有其他因数的数。 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。 0和1既不是质数也不是合数,最小的质数是2 二、方法介绍 1.最直观,但效率最低的写法 public static boolean isPrime(int n){ if (n <= 3) { return n > 1; } for(int i = 2; i < n; i++){ if (n % i == 0) { return false; } } return true; } 这里特殊处理了一下小于等于3的数,因为小于等于3的自然数只有2和3是质数。 然后,我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。 2.初步优化 假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我们可以改进上述方法优化循环次数。如下: public static boolean isPrime(int n) { if (n <= 3) { return n > 1; } int sqrt = (int

百练 3177 判决素数个数

核能气质少年 提交于 2020-01-01 02:54:52
原题链接 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y)。 Input 两个整数X和Y(1 <= X,Y <= 10 5)。 Output 输出一个整数,表示X,Y之间的素数个数(包括X和Y)。 Sample Input 1 100 Sample Output 25 #include<iostream> #include<math.h> using namespace std; int sushu(int s)//判断素数 { for (int i = 2; i <= (int)sqrt(s*1.0); i++) { if (s % i == 0) return 0; } return 1; } int main() { int x, y,i,sum=0; cin >> x >> y; if (x > y)//x和y的值不确定,需要判断大小然后互换。 { int t = x; x = y; y = t; } for (i = x; i <= y; i++) { if (i == 1) continue; if (sushu(i)) sum++; } cout << sum; return 0; } 来源: CSDN 作者: moyangxian 链接: https://blog.csdn.net/weixin_45809826/article/details

Python 中素数的玩法

你说的曾经没有我的故事 提交于 2019-12-29 00:08:14
质数 质数又称素数。指整数在一个大于1的自然数中, 除了1和此整数自身外,没法被其他自然数整除的数 。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的作用。 质数的分布规律是以36N(N+1)为单位,随着N的增大,素数的个数以波浪形式渐渐增多。 孪生质数也有相同的分布规律。 素数,普遍认为的分布规律是没有规律。时而连续出现,时而又相隔很远很远。有远亲、有近邻,地球对面也还有几个好朋友。 素数,真的就没有规律吗? 合数可以用公式来表示,而素数且不能用公式来表示。这就是素数。 不过这里其实就蕴含着秘密。 既然合数能用公式表示,间接的也就说明了,素数必须服从这些公式的限制。而研究合数,其实也是研究素数。 有2个根深蒂固的观念: 1、素数的个数总是按照自然数增加10倍来统计展现的。因为这里一直沿用π(x)与x/lnx的统计方法。 2、100以内有25个素数,1000以内有168个素数。就产生了一种根深蒂固的观念:素数越来越稀疏。 当然这些都没有错误,否则也不会一直陪伴着素数研究到现在,但它禁锢了人们的思想。有一些数据似乎与之相悖。 列举一些四胞胎素数的例子, 四胞胎素数是很少的,在自然数1000亿以内仅仅有1209317组。平均间距为82691。两组之间相距是很远的

Python 中素数的玩法

家住魔仙堡 提交于 2019-12-29 00:06:05
质数 质数又称素数。指整数在一个大于1的自然数中, 除了1和此整数自身外,没法被其他自然数整除的数 。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的作用。 质数的分布规律是以36N(N+1)为单位,随着N的增大,素数的个数以波浪形式渐渐增多。 孪生质数也有相同的分布规律。 素数,普遍认为的分布规律是没有规律。时而连续出现,时而又相隔很远很远。有远亲、有近邻,地球对面也还有几个好朋友。 素数,真的就没有规律吗? 合数可以用公式来表示,而素数且不能用公式来表示。这就是素数。 不过这里其实就蕴含着秘密。 既然合数能用公式表示,间接的也就说明了,素数必须服从这些公式的限制。而研究合数,其实也是研究素数。 有2个根深蒂固的观念: 1、素数的个数总是按照自然数增加10倍来统计展现的。因为这里一直沿用π(x)与x/lnx的统计方法。 2、100以内有25个素数,1000以内有168个素数。就产生了一种根深蒂固的观念:素数越来越稀疏。 当然这些都没有错误,否则也不会一直陪伴着素数研究到现在,但它禁锢了人们的思想。有一些数据似乎与之相悖。 列举一些四胞胎素数的例子, 四胞胎素数是很少的,在自然数1000亿以内仅仅有1209317组。平均间距为82691。两组之间相距是很远的

判断 一个数 是不是 质数 / 素数

给你一囗甜甜゛ 提交于 2019-12-27 18:08:24
判断 一个数 是不是 质数 / 素数 【面试必备 100题 系列 】- 001 - 判断 一个数 是不是 质数 / 素数 一、命题分析: 质数 又称 素数 。指整数在一个大于1的 自然数 中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个 正因数 (1和自己)的自然数即为素数。比1大但不是素数的数称为 合数 。1和0既非素数也非合数。素数在 数论 中有着很重要的作用。 二、答案解析: 1、简洁、低效方案: public static boolean isPrime(int n){ if (n <= 3) { return n > 1; } for(int i = 2; i < n; i++){ if (n % i == 0) { return false; } } return true; } 首先,过滤一下小于等于 3 的数,因为小于等于3的自然数只有 2 和 3 是质数/ 素数。 然后,我们只需要从 2 开始,一直到小于其自身,依次判断能否被 n 整除即可,能够整除则不是质数/ 素数,否则是质数/ 素数。 2、优化方案: 假设 n 是合数,必然存在 非1 的两个约数 p1 和 p2 ,其中 p1<=sqrt(n) , p2>=sqrt(n) 。 由此我们可以改进上述方法优化循环次数。如下: public static boolean isPrime(int

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[]