素数

素数

丶灬走出姿态 提交于 2020-11-26 05:23:41
问题描述: 素数(质数)指的是不能被分解的数,除了1和它本身之外就没有其他数能够整除。 求100以内的所有素数。 我的代码: import math def prime(n): count=0 for i in range(2,int(math.sqrt(n))+1): if n%i==0: count=1 if count!=1: return True else: return False a=[] for j in range(2,100): if prime(j): a.append(j) print a 结果: [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] 我的思路: 原理:在一般领域,对正整数n,如果用2到n的平方根之间的所有整数去除,均无法整除,则n为质数。 大致流程是:先定义一个函数,判断传入的数是否为素数,然后使用该函数遍历100以内的数,将满足的数添加进列表,最后再输出; 其中,count是一个状态检查器,值为1时表示不是素数,为0时表示是素数; 示例代码: def isPrimeNumber(n, s): for k in s: if k * k > n: break if n % k == 0: return

字符串哈希

会有一股神秘感。 提交于 2020-04-06 06:00:53
转 http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others) Memory Limit: 1300/1300KB (Java/Others) Submit Status 一天,韩爷去百度面试,面试官给了他这么一个问题。 给你2万个字符串,每个字符串长度都是100,然后把2万个字符串丢入一个 set< string >g 中,问最终set里含有多少个元素? g 是一个用来存储字符串、具有去重功能的容器,即相同字符串在 g 中只能保留一个。 两个字符串相等,当且仅当,长度一样且对应位置的字符都一样。 韩爷前晚没睡好,随手写了一个程序交给面试官,然后就gg了。 #include<iostream> #include<string> #include<set> using namespace std; string s; set<string>g; int main(){ for(int k=1;k<=20000;k++){ cin>>s; g.insert(s); } cout<<g.size()<<endl; return 0; } 韩爷醒来之后,发现这只是一个梦(还好只是个梦)。他回忆起梦中的面试官给他的内存限制和时间限制非常低,这么做肯定过不了,那么,现在你不在梦中

【模板】线性筛素数

流过昼夜 提交于 2020-04-04 06:15:04
【模板】线性筛素数 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。 接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。 输出格式: 输出包含M行,每行为Yes或No,即依次为每一个询问的结果。 输入输出样例 输入样例#1: 100 5 2 3 4 91 97 输出样例#1: Yes Yes No No Yes 说明 时空限制:500ms 128M 数据规模: 对于30%的数据:N<=10000,M<=10000 对于100%的数据:N<=10000000,M<=100000 样例说明: N=100,说明接下来的询问数均不大于100且不小于1。 所以2、3、97为质数,4、91非质数。 故依次输出Yes、Yes、No、No、Yes。 #include<iostream> #include<algorithm> #include <cstring> #include<vector> #include<math.h> using namespace std; int su[10000010];//素数表,默认为0,值为0代表是素数,值为1代表不是素数 bool out[10000010];//判断素数,默认为false 如果值为true

杭电 -- 2136

妖精的绣舞 提交于 2020-04-04 03:10:48
题意及思路 题意:给定一个1到1000000之间的数,求其最大素数因子在素数中的相对位置(第几位)。注意:1的最大素数因子在其第0位。 思路:一开始我打算用一般求素数法解决,但是发现可能行不通(TLE)。于是我到网上看到了一篇解答了我疑问的博文,他用的是素数筛法(很奇妙,我之前没用过,具体细节见代码)。特别感谢这些大佬的分享记录。 踩坑点:TLE问题。读题不细心。我最早开始以为这题是找某个数的最大素数因子,但是发现结果与样例不一致,搞得我很蒙。后面读题发现是求position(位置),哦豁,原来是求最大素数因子的相对位置。 在此附上那位大佬的博文地址 -- https://blog.csdn.net/wyf12138/article/details/51694295 代码 import java.util.Scanner; public class Main{ private static final int max = 1000010; private static int primes[] = new int[max]; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n, pos = 0; // ***筛选素数法*** primes[1] = 0; for

7.16dfs例题:素数环

元气小坏坏 提交于 2020-04-03 15:31:07
素数环: 输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数, 输出时从整数1开始,逆时针排列。同一个环应恰好输出一次。 n<=16 样例:  输入:   6  输出:   1 4 3 2 5 6   1 6 5 2 3 4 思路: 素数环特点,每个数和前一个数的和为素数。由题目得知输出从1开始,可以把初始化容量为n的数组,下标0的值固定为1。然后从下标1开始dfs。 已经填入1,那么从2~n开始尝试填入数组中,前提条件必须满足数组中没有尝试填入的这个数 ||和上一个数之和为素数。 如果满足条件则填入数组中,继续dfs下标得+1。然后做回溯。 出口,下标等于n && 数组的首尾相加为素数,则输出数组,并return。 1 import java.util.Scanner; 2 3 public class Seven_16dfs素数环 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int n = sc.nextInt(); 7 int[] r = new int[n]; 8 r[0] = 1; 9 dfs(n, r, 1); 10 } 11 12 private static void dfs(int n, int[] r, int cur) {

素数之和(筛法求素数)

强颜欢笑 提交于 2020-03-27 05:49:28
1244: 算法提高 素数求和 时间限制: 1 Sec 内存限制: 256 MB 提交: 4 解决: 1 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 输入一个自然数n,求小于等于n的素数之和 输入 2 输出 2 样例输入 2 样例输出 2 提示 数据规模和约定 测试样例保证 2 <= n <= 2,000,000 来源 #include<iostream> #include<string.h> #include<math.h> using namespace std; int a[2000000]={0}; int main() { int n,i,j; cin>>n; for(i=2;i<=2000000;i++) { if(a[i]==1) continue; else { for(j=i+i;j<=2000000;j+=i) { if(j%i==0) a[j]=1;} } } long long int sum=0; for(i=2;i<=n;i++) { if(a[i]==0) { sum+=i; } } cout<<sum<<endl; return 0; } 1244: 算法提高 素数求和 时间限制: 1 Sec 内存限制: 256 MB 提交: 4 解决: 1 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 输入一个自然数 n ,求小于等于 n 的素数之和

筛选法求n以内所有的素数

不想你离开。 提交于 2020-03-25 15:42:10
求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13 红色为删除的元素 第一轮 2的倍数: 2 3 4 5 6 7 8 9 10 11 12 13 第二轮 3的倍数: 2 3 4 5 6 7 8 9 10 11 12 13 第三轮 5的倍数: 2 3 4 5 6 7 8 9 10 11 12 13 。。。。。 1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int n,i,j; 8 9 cin >> n; 10 11 int *p = new int[n + 1]; 12 13 for (i = 0; i <= n; ++i) 14 p[i] = 1; 15 16 17 for (i = 2; i <= n; ++i) 18 { 19 if (p[i]) 20 { 21 for (j = 2; i*j <= n; ++j) 22 p[i*j] = 0; 23 } 24 } 25 26 for (i = 2; i <= n; ++i) 27 if (p[i]) 28 cout << i << " "; 29 30 cout << endl; 31 32

素数表(筛选法)

不打扰是莪最后的温柔 提交于 2020-03-25 12:18:59
#include<stdio.h> #include<algorithm> using namespace std; bool arr[101]; //标记是否为素数:false就是素数,true就不是素数 void isF() {   for(int i=2 ; i<101 ; ++i)   {     if(arr[i]==false)     {       for(int j=i+i ; j<101 ; j+=i)       arr[j]=true; //将i的2倍及其以上的倍数数都改为合数(true)     }   } } int main() {   isF();   for(int i=2 ; i<101 ; ++i)   if(arr[i]==false)   printf("%d ",i);   system("pause");   return 0; } 来源: https://www.cnblogs.com/Evence/p/4313627.html

PHP筛选法求素数

心已入冬 提交于 2020-03-25 12:03:06
首先,素数是只能被自己和1整除的正整数,特别指出的是我们规定1不是素数。 分析: 首先判断一个数是不是素数: 我们这样做的,用选定的这个数除以小于当前这个数的平方根的所有的数,如果有一个能整除,则不是素数,否则素数。这里的关键是为何只用是平方根就行呢? 是这样的,不难发现,当一个数等于两个数的乘积时,那么这两个数中必然有一个要小于这个数的平方根,另外一个数肯定大于这个数的平方根,也就说当我们发现当前数能被比他平 方根小的数整除,就不用去整除另一个比他平方根大的数,减少循环次数,让算法更简洁。 方法一:普通方法 代码实现: <?php function sushu($n) { for($j=2;$j<=$n;++$j){ for($i=2,$sqrt=sqrt($j);$i<=$sqrt;++$i){ //只用判定当前数的平方根 if($j%$i==0){ continue 2; //如果不是素数,则跳出内层循环,从外层循环继续执行 } } echo $j; echo "<br>"; } } sushu(100); //100以内的素数 ?> 方法二:利用筛选法求素数 分析:何为筛选法呢?是这样的,首先我们把1标识成素数,把0标识成非素数,假设给出的N个数都是素数,标识为1 从第一个数开始筛选,遇到当前这个数的倍数就把他的倍数标识改为0,标识完后再进入第二个数重复第一个数的操作

素数筛选法

99封情书 提交于 2020-03-25 12:02:15
素数筛选法 素数(又称质数):指在大于一的自然数中,只能被1和它自身整除的自然数; 素数筛选法是指一种非常规的素数判定方法,比较高效率; 原理:任何数的整数倍必定不是素数,大于二的偶数必定不是素数。 我们以找出100以内的素数为例,利用原理,我们可以首先排除偶数是素数,然后进一步判断奇数 实现将偶数标记为0,素数标记为1;(也可以用一个bool数组将偶数标记为false,奇数标记为true) 下面是全部代码 #include <iostream> #include <cmath> #define MAX 100 using namespace std; int main() { //设置标记,将偶数标记为0 int prime[MAX+1]; for(int i=1;i<=MAX;i++) { if(i%2==0) { prime[i]=0; } else prime[i]=1; } for(int i=3;i<=sqrt(MAX);i++) { if(prime[i]==1) { for(int j=i+i;j<=MAX;j=j+i) { prime[j]=0; } } } cout<<"2"<<" "; for(int i=3;i<=MAX;i++) { if(prime[i]==1) cout<<i<<" "; } return 0; } 来源: https://www