判断素数

leetcode —— 866. 回文素数

主宰稳场 提交于 2019-12-15 04:37:04
求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。 例如,12321 是回文数。 示例 1: 输入:6 输出:7 示例 2: 输入:8 输出:11 示例 3: 输入:13 输出:101 提示: 1 <= N <= 10^8 答案肯定存在,且小于 2 * 10^8。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/prime-palindrome 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ———————— 解题思路:先判断是不是回文数字,再判断是不是素数。注意,当数字的位数是偶数时(位数>=4),不存在回文素数。因为例如1111,1221等都是11的倍数,所以都不是素数。 所以为了加快运行速度,可以跳过偶数位数的情况。具体的C++代码如下所示: class Solution { public : int primePalindrome ( int N ) { if ( N == 1 ) return 2 ; if ( N <= 3 ) return N ; while ( true ) { if ( judge (

L1-028 判断素数 (10分)

女生的网名这么多〃 提交于 2019-12-15 03:22:39
L1-028 判断素数 (10分) 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数 N (≤ 10),随后 N 行,每行给出一个小于2​31​​的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出 Yes ,否则输出 No 。 输入样例: 2 11 111 输出样例: Yes No import math def funx(x): k = 1 for i in range(2, int(math.sqrt(x))+1): if x % i == 0: k=0 if x == 1: k =0 return k n = int(input()) m = [] for i in range(n): temp = int(input()) m.append(funx(temp)) for i in m: if i == 1: print('Yes') else: print('No') 来源: CSDN 作者: chen_zan_yu_ 链接: https://blog.csdn.net/chen_zan_yu_/article/details/103518793

素数和质因子分解

送分小仙女□ 提交于 2019-12-14 02:18:54
素数(质数):一个正整数n,除了1和其本身外不能被其他任何数整除,否则成为合数。 1 既不是素数也不是合数。 素数的判断: 对于一个整数n,判断素数要判断其是否能被2,3,…, n-1范围内的数整除,时间复杂度是O(n),但是这样会多出很多的运算。如果一个整数k可以被n整除,由于k*(n/k)==n,所以n/k也能被n整除,且两个数一定满足其中一个小于等于sqrt(n),所以在遍历判断时只需要遍历到sqrt(n)就可以了。 bool isPrime(int n){ if(n <= 1) return false; //特判 int sqr = (int)sqrt(1.0*n); //对n取根号 for(int i=2; i<=sqr; i++){ if(n % i == 0) return false; } return true; //n 是素数 } 由上面的思路,我们可以使用打表的技巧,将从1~n之间的每个数进行判断,如果是素数就加入素数表。方便之后的查找使用。 //求素数表 const int maxn = 101; //表长 int prime[maxn], pNum = 0; //prime数组存放所有素数,pNum为素数个数 bool p[maxn] = {0} ; // p[i] == true 表示i是素数 void Find_Prime(){ for(int i=

判断可逆素数

不问归期 提交于 2019-12-13 08:37:33
可逆素数 首先要知道什么是可逆素数 素数:在大于1的自然数中,除了1和它自身以外,不能被其他自然数整除的数。 可逆素数:将一个素数的各个位置的数字倒置过来构成的反序数仍是素数,则该数为可逆素数。 以下为代码实现(C语言): # include <stdio.h> int pd ( int x ) { //判断是否为可逆素数 int i , y = 0 , flag = 0 ; if ( x < 2 ) printf ( "no" ) ; //小于2的整数不考虑 if ( x == 2 ) printf ( "yes" ) ; //2为可逆素数 for ( i = 2 ; i < x ; i ++ ) { //判断传入的整数是否为素数 if ( x % i == 0 ) { //该数存在除了1与它本身的整数可以将它整除,即该整数不是素数 printf ( "no" ) ; break ; // 则输出no并跳出for循环 ,此时flag==0 } else { if ( i == x - 1 ) { //for循环执行到最后一次还未跳出,证明该数仅有1与它本身可以将它整除 flag = 1 ; //即该数为素数 ,flag==1 } } } //end for if ( flag == 1 ) { //该整数为素数,进一步判断它是否为逆素数 while ( x > 0 ) { /

zzuli新生训练学习第三天题解

随声附和 提交于 2019-12-13 08:15:00
A - 素数判定 ~~ 原网址 http://acm.hdu.edu.cn/showproblem.php?pid=2012 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。 Input 输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。 Output 对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。 Sample Input 0 1 0 0 Sample Output OK 暴力判断每一项是否为素数即可,有一项不是则跳出循环 # include <bits/stdc++.h> using namespace std ; int prime ( int n ) ; int main ( ) { int x , y , n , i ; while ( cin >> x >> y , x != 0 || y != 0 ) { for ( i = x ; i <= y ; i ++ ) { n = i + i * i + 41 ; if ( prime ( n ) == 0 ) break ; } if ( i > y ) cout << "OK\n" ; else cout << "Sorry

HDU - 1431 素数回文

我与影子孤独终老i 提交于 2019-12-12 12:41:49
题目链接: https://vjudge.net/problem/HDU-1431 题目描述: xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000); Input 这里有许多组数据,每组包括两组数据a跟b。 Output 对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。 Sample Input 5 500 Sample Output 5 7 11 101 131 151 181 191 313 353 373 383这题因为a,b的取值比较大,所以如果我们直接用埃氏筛的然后再判断回文的话首先内存都不够用,所以我们可以把所有符合条件的回文素数都printf出来,然后再把结果都塞进一个数组里面,这样就节省了空间,然后我们再用二分搜索来让所判断的元素与表中的元素相对照,就能知道所判断的元素是不是素数回文数。下面是打表函数 const int maxn = 1e8 + 10; bool is_res (ll n) { //判断回文 ll t = n, res = 0; while(t) { res = res*10 + t%10; t /= 10; }

判断素数(循环结构)

a 夏天 提交于 2019-12-10 23:35:09
判断素数(循环结构) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 从键盘上输入任意一个正整数,然后判断该数是否为素数。 如果是素数则输出"This is a prime." 否则输出“This is not a prime.” Input 输入任意一个正整数n(1 <= n <= 1000000)。 Output 判断n是否为素数,并输出判断结果: 如果n是素数则输出"This is a prime." 否则输出“This is not a prime.” 特别提醒:请注意对1的判定,1不是素数。 Sample Input 3 Sample Output This is a prime. 代码 # include <stdio.h> int main ( ) { int m , i ; scanf ( "%d" , & m ) ; if ( m < 2 ) printf ( "This is not a prime." ) ; else if ( m == 2 ) printf ( "This is a prime." ) ; else { for ( i = 2 ; i < m ; i ++ ) { if ( m % i == 0 ) break ; } if ( i == m ) printf

Go语言学习五 go的循环结构 chan range

依然范特西╮ 提交于 2019-12-07 23:07:29
Go 语言循环语句 Go 语言循环语句 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。 以下为大多编程语言循环程序的流程图: Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执行语句块 循环嵌套 在 for 循环中嵌套一个或多个 for 循环 循环控制语句 循环控制语句可以控制循环体内语句的执行过程。 GO 语言支持以下几种循环控制语句: 控制语句 描述 break 语句 经常用于中断当前 for 循环或跳出 switch 语句 continue 语句 跳过当前循环的剩余语句,然后继续进行下一轮循环。 goto 语句 将控制转移到被标记的语句。 无限循环 如过循环中条件语句永远不为 false 则会进行无限循环,我们可以通过 for 循环语句中只设置一个条件表达式来执行无限循环: package main import "fmt" func main() { for true { fmt.Printf("这是无限循环。\n"); } } Go 语言 for 循环 由 youj 创建, 最后一次修改 2016-07-22 Go 语言 for 循环 Go 语言循环语句 for循环是一个循环控制结构,可以执行指定次数的循环。 语法 Go语言的For循环有3中形式,只有其中的一种使用分号。 和 C 语言的 for 一样:

PAT_B_1007 素数对猜想 (20 分)【超时问题】

天大地大妈咪最大 提交于 2019-12-06 23:33:59
PS:刚开始写博客 ,格式掌握不好,希望见谅 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 N (<10​5​​),请计算不超过 N 的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数 N 。 输出格式: 在一行中输出不超过 N 的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 #include<iostream> #include<math.h> using namespace std; int sushu(int n) { int flag = 1; int i = 2; int nn = sqrt(n); while (i <= nn) //判断到根号下n即可,之后的数字是重复 { if (n % i == 0) { flag = 0; break; } ++i; } return flag; } int main() { int n; cin >> n; int count = 0, issushu = 0; int pn = 2, pn1 = 2; for (int i = 3; i <= n; i++) { if (i % 2 == 0)continue; issushu =

Python:1007 素数对猜想

守給你的承諾、 提交于 2019-12-06 23:33:43
很尴尬,忘了什么是素数了 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 文章目录 一、题目 二、代码 一、题目 二、代码 思想 : 这个题目本身不难,难的是对题目的优化 需要知道素数的定义,知道和奇数的区别 对代码的优化解决掉超时的问题,优化可以从以下考虑 将除了 2 的偶数自动过滤,不参加运算 将每次符合要求的数加入列表,后面的数字只需要和列表中的数进行比较即可,看看是否是素数 然而,结果很残酷,总是最后一个超时运算,观察大佬的代码,大概意思就是,合乎要求的数中除了 2 和 3 之外,其余的数都与6的倍数想差1 比如 :[2,3,5,7,11,13,17,19] 但是,不好理解,也不好编写代码,所以先记录下,希望有后续把 后续来了,另外一种思路是一旦一个数符合要求,那么他的倍数将不符合要求,比如2符合则,4,6,8等不符合要求,3符合要求则 6,9,12等不符合要求 因此思路是建立一个N+2 的列表(加2是因为从2开始判断到N结束,所以长度加2)值均为1,找到一个素数后,然后将N以内的该素数的倍数相应位置为0 N = int ( input ( ) ) n = 0 num = [ ] for i in range ( 2 , N + 1 ) : flag = 1 if i == 2 or i % 2 != 0 : for j in num : if i %