判断素数

L1-028 判断素数 (10分)

99封情书 提交于 2020-02-18 05:46:22
本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。 输入样例: 2 11 111 输出样例: Yes No 题目链接: https://pintia.cn/problem-sets/994805046380707840/problems/994805106325700608 判断是否为素数,只需要判断到一个数的平方根即可,否则会超时。 解题代码: # include <stdio.h> # include <math.h> int prime ( int n ) { int k ; if ( n == 1 ) return 0 ; k = ( int ) sqrt ( n ) ; for ( int i = 2 ; i <= k ; i ++ ) { if ( n % i == 0 ) return 0 ; } return 1 ; } int main ( ) { int T , x ; scanf ( "%d" , & T ) ; for ( int i = 1 ; i <= T ; i ++ ) { scanf ( "%d" , & x ) ; if ( prime (

航电OJ C语言-实验6

二次信任 提交于 2020-02-17 22:42:25
1. (20分) 6.2 写一个判断素数的函数,在主函数中输出1~100间的素数信息 输入描述 无 输出描述 输出1~100之间所有的素数,中间用空格隔开 输入样例 无 输出样例 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 用户代码 # include <stdio.h> int main ( ) { int i , j , k ; for ( i = 1 ; i <= 100 ; i ++ ) { k = 0 ; for ( j = 1 ; j <= i ; j ++ ) { if ( i % j == 0 ) k ++ ; } if ( k == 2 ) printf ( "%d " , i ) ; } return 0 ; } 最后保存时间: 2019-11-27 10:56:26 本题得分:20分(1/1) 查看最新评判结果 2. (20分) 6.3 设a,b,c为三个大于零的正整数,计算并输出下列不定方程组解的个数Number以及满足此条件的所有a,b,c之和sum。 题目描述 设a,b,c为三个大于零的正整数,计算并输出下列不定方程组解的个数Number以及满足此条件的所有a,b,c之和sum。 不定方程组为:(1) a+b+c=13 (2)a-c=5,且(a,b,c>0)

米勒拉宾素数检测

三世轮回 提交于 2020-02-17 14:11:21
是一种随机化素数检测算法 基于下面的定理 费马小定理:如果p是素数,a不是p的倍数,那么 \(a ^ {p - 1} \equiv 1(\mod \ p)\) 二次探测定理:如果p是一个素数,且x∈[1,p - 1],则方程 \(x ^2 \% p = 1\) 的解为 \(x = 1\) 或 \(x = p - 1\) 费马小定理的逆命题:如果 \(a^{p - 1} \equiv 1(\mod\ p)\) 成立,那么p是一个素数且a不是p的倍数 可以确定费马小定理的逆命题不一定成立。 那么对于一个数,如果不满足 \(a ^ {p - 1} \equiv 1(\mod \ p)\) 那么一定不是素数,如果满足,那么有可能是素数,取a = [1,p)的随机数,在进行判断,进行几次即可,则为素数的可能性越大 但是对于卡迈克尔数, \(卡迈克尔数是一个合数p,a不是p的倍数,但符合a^{p - 1}\equiv 1(\mod \ p)\) 则需要每次判断费马小定理时,进行二次探测,排除卡迈克尔数 算法 当p为2时为素数 当p小于2或偶数时不是素数 10次检测,随机化 \(a∈[1,p)\) 求出 \(a^u \% n\) ,然后二次探测判断 其中进行优化,使得进行二次探测时的幂小一点,然后在慢慢扩大,不然,如果直接计算p - 1次幂,可能会造成溢出的情况 #include

java习题集2

血红的双手。 提交于 2020-02-17 05:38:46
1、打印 2 到 1000 之间、包括 2 和 1000的所有素数,每行显示 8 个素数。数字之间用一个空格字符隔开。 /* 什么是素数 就是除了1和其本身之外 没有其他的数字可以整除的 num 2 ~ m ~ num-1 找到一个数字 如果这个数字m num%m==0 num不是素数 如果一个都没有找到的话 这个数字是素数 */ public class A { public static void main ( String [ ] args ) { int count = 0 ; //当前素数的个数 boolean flag = true ; for ( int num = 2 ; num <= 1000 ; num ++ ) { for ( int m = 2 ; m <= num - 1 ; m ++ ) { if ( num % m == 0 ) { flag = false ; break ; } } if ( flag ) { count ++ ; System . out . print ( num + " " ) ; if ( count % 8 == 0 ) { //8 16 24 32 System . out . println ( ) ; } } flag = true ; } } } /* int num=10; boolean flag=true;

ACM.大一寒假2.15考试

时光毁灭记忆、已成空白 提交于 2020-02-16 19:26:30
机器人 Problem:A Time Limit:1000ms Memory Limit:65535K Description 机器人Bo很聪明,会做许多事情。惟独对自然数的理解与人类不一样,它是从右往左读数。比如,它看到123时,会理解成321.让它比较23与15哪一个大,它说15大。原因是它的大脑会以为是32与51在进行比较.再比如让它比较29与30,它说29大。 当然对于像90,它会把它当成9处理。给定Bo N个自然数x,让它将这N个数按从小到大排序出来。你会认为它如何排序? Input 第一行: N表示有多少个数. (2<=N<=25 ) 接下来有N个数字x.( 0<=x<1e9 ) Output 对于每一行测试数据,输出一行,为所有排好序的元素,元素之间有一个空格. Sample Input 3 45 69 87 4 66 98 34 32 Sample Output 45 87 69 32 34 66 98 签到题,写一个函数来按要求转换数字,根据转换后的数字比较,创建一个结构体比较即可,我用优先队列来做纯粹是熟练一下, 实际没必要,竟然因为多一个空格PE了两次,我真的撒币。 # include <bits/stdc++.h> using namespace std ; struct sa { int real ; //原来的值 int now ; //转化后的值 }

PAT 1007 素数对猜想 (20分)

南楼画角 提交于 2020-02-16 14:36:43
题目描述: 让我们定义d​n​​ 为:d​n​​=p​n+1−pn,其中p​i是第i个素数。显然有d1​​ =1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10​5​​ ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 题意简化: 找素数对,若两个素数之和相差为2,则这两个数为一对素数对。 菜鸡版本: 思路:先将给定数以内的所有素数求出,分别放在数组中,再判断是否存在素数对。 # include <iostream> using namespace std ; int main ( ) { int num ; int k = 1 ; cin >> num ; int arr [ 10000 ] ; arr [ 0 ] = 1 ; int flag = 1 ; for ( int i = 2 ; i <= num ; i ++ ) { flag = 1 ; for ( int j = 2 ; j * j <= i ; j ++ ) { if ( ( i % j == 0 ) && ( i != j ) ) { flag = 0 ; break ; } } if ( flag == 1 ) {

PAT 1007 素数对猜想

这一生的挚爱 提交于 2020-02-16 13:50:17
PAT 1007 素数对猜想 题目: 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 N (<105),请计算不超过 N 的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数 N 。 输出格式: 在一行中输出不超过 N 的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 代码: #include <iostream> #include <vector> #include <cmath> using namespace std; #include <iostream> #include <vector> #include <cmath> using namespace std; bool is_prime( unsigned long long num ) { //两个较小数另外处理 if(num ==2|| num==3 ) return true ; //不在6的倍数两侧的一定不是质数 if(num %6!= 1&&num %6!= 5) return false ; unsigned long long tmp =sqrt( num); //在6的倍数两侧的也可能不是质数 for(int i= 5;i <=tmp; i+=6 )

NEFU 素数

馋奶兔 提交于 2020-02-15 09:46:00
函数版素数判定 # include <bits/stdc++.h> using namespace std ; int num [ 10005 ] ; int a [ 10005 ] ; int t = 0 ; int sh ( ) //埃氏筛法(一般来说用此法筛素数就够了) { memset ( a , 1 , sizeof ( a ) ) ; a [ 0 ] = a [ 1 ] = 0 ; for ( int i = 2 ; i <= 10005 ; i ++ ) { if ( a [ i ] ) { num [ t ] = i ; t ++ ; for ( int j = 2 ; j * i < 10005 ; j ++ ) //筛掉当前数的倍数 a [ j * i ] = 0 ; } } return 0 ; } int su ( int n ) //判断是不是素数的函数 { int mark = 0 ; for ( int i = 0 ; num [ i ] <= sqrt ( n * 1.0 ) ; i ++ ) //判断方法 { if ( n % num [ i ] == 0 ) { mark = 1 ; break ; } } if ( n == 1 ) //此法不能判断1,把1单独拿出来 mark = 1 ; return mark ; } int main (

2020寒假专题训练:数论

邮差的信 提交于 2020-02-15 09:25:59
Day1 20.02.11 一、素数判定:Miller-Rabbin ①费马小定理:$a^{p-1} \equiv 1 \pmod p$($p$为素数). 因此可以选取若干个 $a$,对 $p$ 进行判定. 满足条件的 $p$ 为素数的概率在 $\frac{3}{4}$ 左右. ②二次探测定理:$x^2 \equiv 1 \pmod p$ 当 $p$ 为大于 $2$ 的素数时仅有两个解 $x_1=1,x_2=p-1$. 因此考虑选取 $9$ 至 $12$ 个素数,先使用费马小定理判定,再对 $a^{\frac{p-1}{2^k}}$ 使用二次探测判定. 代码如下: inline long long mul ( long long x,long long y,long long mod ) { return (long long)((__int128)x*y%mod); } inline long long power ( long long x,long long y,long long mod ) { long long z=1; for ( ;y;y>>=1,x=mul(x,x,mod) ) if ( y&1 ) z=mul(z,x,mod); return z; } const long long Prime[13]={1,2,3,5,7,11,13,17,19,61

RSA简单加密解密

纵饮孤独 提交于 2020-02-13 21:11:18
简介:   RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。   RSA的算法涉及三个参数, n、e1、e2 。   其中, n是两个大质数p、 q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。    e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。    (n,e1)为公钥对,(n,e2)是密钥对。   RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;   e1和e2可以互换使用,即:A=B^e2 mod n;B=A^e1 mod n;   更详解的介绍请自行查阅相关资料.... 算法(源码) :( 注:本代码只适合小数,不适合大数 ) View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <time.h> 4 #include <math.h> 5 6 // PRIMENUMBER指定构造素数数组的元素个数,200以内的素数有39个 7 #define PRIMENUMBER 39 8 9 usingnamespace std; 10 11 bool IsPrime(long