判断素数

1411:区间内的真素数

自作多情 提交于 2020-01-31 18:48:56
这个题一开始的想法是定义两个函数,一个用来判断素数,另一个用来将输入的数做反序处理,再次判断是否为素数。 定义一个一维数组,用来存储符合题目条件的数。用一个计数器,来控制输入数组时的下标。 1 int m,n,i,k=0; 2 cin>>m>>n; 3 for(i=m; i<=n; i++) 4 if( a(i) && a(b(i)) ) 5 { 6 k++; 7 c[k]=i; 8 } 在定义反序函数时,有点困难,对我来说还是有难度的: 1 int b(int n) 2 { 3 int s=0; 4 while(n>0) 5 { 6 s=s*10+n%10; 7 n/=10; 8 } 最后输出时,也有一个细节,就是每个数之间要输出“,’” 而且最后一个后面没有“,”一开始我没有注意,提交后10个测试点只对了3个。之后做题一定要注意细节。 1 for(i=1; i<k; i++) 2 cout<<c[i]<<","; 3 cout<<c[k]; 来源: https://www.cnblogs.com/zkw666/p/12246010.html

洛谷P1217 [USACO1.5]回文质数 Prime Palindromes (C语言 + 详细注释 + 多优化)

我的未来我决定 提交于 2020-01-29 10:12:34
//本题思路并不难想,如果区间内的数既是素数,也是回文数,那么就是回文素数,写两个函数判断素数和回文数即可。然鹅本题并不会让你那么轻松通过(毕竟难度是普及-呢),很有可能你过了样例,但是提交得到的结果是一片RE(超时),因为本题最大数据达到了一亿,一个个的遍历,必然会很浪费时间,所以需要一定的优化,把部分数据直接排除。具体优化如下: 1:偶数必然不是素数,所以偶数不用考虑; 2:由数论知识得:偶数位的回文数,除了11其他的都可以被11整除,必然不是素数,所以最大数据只需到10000000(一千万,10000000~100000000之间的数都是八位数,偶数,可直排除) (详见 https://www.zhihu.com/question/67646272 ) 3:用埃拉托色尼法筛选素数,节省时间(详见 https://blog.csdn.net/qq_45472866/article/details/104051475 ) 下面是我AC的代码: #include<stdio.h> void checkprime(int p); int prime[10000000]; //只需开到一千万(开到一亿的话,会超内存) int is_huiwen(int p); int main() { int a, b, left, right, i; //left为区间左端点,right为右端点

A1015

天涯浪子 提交于 2020-01-29 06:09:25
本题思路:1、记录N是否为素数的判断(开始遗漏了这处的判断) 2、将N转换为d进制记录在数组中 3、反转,实质是数组从下标0处开始遍历 4、将反转后的d进制转换为十进制 5、对转换后的十进制判断是否是素数,同时,结合最开始对N是否为素数的判断,只有二者皆为素数时,该数才是反转素数,否则不是. 注意点:1是非素数,需要进行特判 # include <cstdio> # include <cstdlib> # include <string.h> # include <math.h> # include <iostream> # include <vector> # include <set> # include <map> # include <string> # include <algorithm> using namespace std ; int store [ 20 ] ; bool judgePrime ( int sample ) { if ( sample == 1 ) return false ; //特判1为非素数 int temp = ( int ) sqrt ( 1.0 * sample ) ; for ( int i = 2 ; i <= temp ; i ++ ) { if ( sample % i == 0 ) return false ; }

素数求取的注意事项

我的梦境 提交于 2020-01-29 01:48:59
素数求取的注意事项 (任意范围内素数的注意事项) 在此类举一些个人易犯错误 1、设置判断循环时,除数从 2 开始 2、使用取余符号**%**而非求商 下附代码供自己注意 #include<iostream> #include<cmath> using namespace std; int check(int n) { int i; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { return 0; } } return 1; } int main() { int min,max; int i; cin>>min>>max; for(;min<=max;min++) { if(check(min)==1) { cout<<min<<" "; } } return 0; } 来源: CSDN 作者: G-holder 链接: https://blog.csdn.net/weixin_45649612/article/details/103582829

数论之阶与原根讲解

ぐ巨炮叔叔 提交于 2020-01-28 19:33:34
前言: 本来想写BSGS算法,但是 笔者今天想打游戏 感觉先写原根会更好一点,所以我们今天重点讨论一下什么是原根、哪些整数有原根、原根的性质和求解。 提要: 为了减少后面的阅读障碍,先简单介绍一下 欧拉函数 φ ( x ) \varphi(x) φ ( x ) ,主要部分后面放积性函数那介绍。(ps:书上符号写的是 ϕ ( x ) \phi(x) ϕ ( x ) ,但网上写的是 φ ( x ) \varphi(x) φ ( x ) ,不过这不重要) 欧拉函数 φ ( x ) \varphi(x) φ ( x ) 的函数值是,小于 x x x 且与 x x x 互质的正整数的个数。 比如 φ ( 6 ) = 2 \varphi(6)=2 φ ( 6 ) = 2 ,因为小于 6 6 6 的正整数中,仅有 1 1 1 与 5 5 5 与其互质。 容易发现, 当 p p p 为素数时,有 φ ( x ) = p − 1 \varphi(x)=p-1 φ ( x ) = p − 1 。 还有欧拉定理:若 g c d ( a , n ) = 1 gcd(a,n)=1 g c d ( a , n ) = 1 ,则 a φ ( n ) ≡ 1 ( m o d    p ) a^{\varphi(n)}\equiv1(mod\;p) a φ ( n ) ≡ 1 ( m o d p ) 。

第七次作业

戏子无情 提交于 2020-01-28 05:06:25
1.题目: 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐) 代码: #include <stdio.h> int isprime(int n); int main() { int i,a=0,b=2,c=1; for(i=2;i<=1000;i++) { if(isprime(i)) { printf("%3d",i); a++; if(b%10==0) printf("\n"); } } printf("%d\n",a); } int isprime(int n) { int b,c=1; for(;c<=n-1;c++) { if(n%b==0) { b=0;break; } } return 0; }   运行结果: 2.题目: .求两个正整数的最大公约数和最小公倍数。用一个函数gcd(int a,int b)求最大公约数,另一个函数lcm(int a,int b)根据求出的最大公约数求最小公倍数。 代码: #include <stdio.h> int gcd(int a,int b); int lcm(int a,int b); int main() { int a,b,c,d,e; printf(" 请输入两个整数,用,隔开\n"); scanf("%d,%d",&a,&b);

Python学习笔记(杂记)

久未见 提交于 2020-01-28 02:09:35
求素数的方法 一、完全遍历法 例:求0-100以内的素数 基本思路: 设计一个变量J,让J在内层循环增长。对于每一个待判定的数 i,当i小于指定范围时,进入外层while循环,让每一个i去除每一个J看看能不能被整除,如果可以则不是素数,如果对于每一个J,这一个i都不能整除,则这个i是素数。 由于素数的因数只有1和它自己,因此,J可以从2起。 执行过程: 首先对 i 和 J 进行一个除法运算,当J<=i/j时(例如i=6时即进入while循环)进入内层while循环。对i与J进行取余运算。如果i是J的整数倍,则i%j就是0(即没有余数)。由于一个not的作用,则会使结果由0变为1,从而使if判断有效,进入里面的break,使得内层while循环结束,即执行后面的if语句。 我们还是以i=6为例,当i=6时 J=2, J<=3(6/2) NOT(6%2 == 0)==1,执行break 进入if(j > i/j)判断.同时,J=2,i/J=3,所以不满足if条件,即不会输出6是素数,即6不会是素数。 如果i不是J的整数倍,比如以i=9为例。当i=9时: J=2, J<=4 (9/2),进入while循环,NOT(9%2 ==1)==0,因此不会执行if后面的语句,即继续进行while内层循环,然后 j += 1,即J=3,然后J<=9/3,进入if进行判断,NOT(9%3 ==0)=

第七次作业

与世无争的帅哥 提交于 2020-01-27 13:13:15
1. 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐) #include <stdio.h> int isPrime(int n); int isPrime(int n) { int i; for(i=2;i<=n-1;i++) { if(n%i==0) return 0; } return n; } int main() { int i,a=0; for(i=2;i<=1000;i++) { if(isPrime(i)) { printf("%4d",i); a++; if(a%10==0) { printf("\n"); } } } printf("一共输出%d个素数",a); return 0; }    2.求两个正整数的最大公约数和最小公倍数。用一个函数gcd(int a,int b)求最大公约数,另一个函数lcm(int a,int b)根据求出的最大公约数求最小公倍数。 #include <stdio.h> int gcd(int a,int b); int lcm(int a,int b); int main() { int a,b,d,c; printf("输入两个正整数"); scanf("%d %d",&a,&b); c=gcd(a,b); d=lcm(a,b);

质因数分解函数

人走茶凉 提交于 2020-01-27 01:20:49
编写函数void func(unsinged int n),实现计算并输出一个正整数的质因数分解式。例如:n为90时,输出90=2*3*3*5。 ①是素数就输出: 可能直接想着先要做个判断了,如果是素数判断结束,输出这个素数。如果不是,在进入下面的分解的步骤吧。 但是,有没有人想过素数的定义是什么?素数是一类只能被1或自身整除的数字对吧?如果去掉之前的这个判断,直接在接下来的分解步骤中去判断会怎样? 假如输入了“11”,“11”是个素数,只能被1和11整除。那么,设置除数从2开始,是不是从2到10为止都没法整除呢?等到了11,11除以11刚好是1,这时候输出11。是不是和上面的判断的结果一样呢? ②、输出质因数的分解式,除数是素数: 在这里可能会有人会疑惑了,如果只用素数整除,是不是应该写个函数去输出素数呢?从2开始,3、5、7、11这样的去循环输出着素数。假如除不尽2就换3,以此类推。 如果真的这样去想,源码不仅会写的特别繁杂不说,还要经过反反复复的调试。那么,有没有更简单的方法呢? 假如,输入一个数字24。24可以分解成3X8或者4X6对吧?但是我们按照①的想法走,第一个除数是2,那么3X8就直接出局了。可能有人会想,24除2得到12,2加1是3,12除以3是4,3再加1是4,除数中有非素数了,不对啊!!!!!!况且4还能拆分成两个2啊?! 那么,可以在除以2的时候做个判断啊

孪生素数(数据结构与算法)(python)

泄露秘密 提交于 2020-01-26 11:09:25
利用判断素数的函数,编写程序找出1-100之间所有的孪生素数(若两个素数之差为2,这两个素数就是一对孪生素数)。例如:3和5,5和7,11和13等都是孪生素数。(python) def Prime(n): if n<2: return False elif n==2: return True else: i=2 for i in range(2,n): if n%i==0: break else: i=i+1 if i==n: return True else: return False for i in range(1,100): if Prime(i)==True and Prime(i+2)==True: print ( i,i+2,"是孪生素数") 来源: CSDN 作者: LY_dreams 链接: https://blog.csdn.net/MengJing_/article/details/103754298