素数

PTA L1-028 判断素数 C语言版

走远了吗. 提交于 2020-02-03 20:50:33
本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数 N (≤ 10),随后 N 行,每行给出一个小于2^31的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。 输入样例: 2 11 111 输出样例: Yes No 代码: # include <stdio.h> # include <math.h> int main ( ) { int k ; scanf ( "%d" , & k ) ; while ( k -- ) { int i , n , f = 1 ; scanf ( "%d" , & n ) ; if ( n == 1 ) printf ( "No\n" ) ; else { for ( i = 2 ; i <= sqrt ( n ) ; i ++ ) { if ( n % i == 0 ) f = 0 ; } if ( f == 1 ) printf ( "Yes\n" ) ; else printf ( "No\n" ) ; } } return 0 ; } 来源: CSDN 作者: lmtxy 链接: https://blog.csdn.net/weixin_44318053/article/details/104157822

华为上机:统计给定的两个数之间的素数的个数

萝らか妹 提交于 2020-02-02 14:38:29
统计给定的两个数之间的素数的个数 描述: 素数是指在一个大于1的 自然数 中,除了1和此 整数 自身外,不能被其他自然数 整除 的数。 给定两个数字m和n,统计这两个数字之间素数的个数。 运行时间限制: 无限制 内存限制: 无限制 输入: 输入为两个整数:m和n 输出: 输出m和n之间的素数的个数 样例输入: 0 10 样例输出: 4 import java.util.*; public class Main5{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ String[] strA = in.nextLine().split(" "); int a = Integer.parseInt(strA[0]); int b = Integer.parseInt(strA[1]); if(a>b){ // 需要增加 int t = a; a = b; b = t; } long count = countPrime(a,b); System.out.println(count); } in.close(); } public static long countPrime(int a,int b){ long count = 0; for

codeforces402D 2000分数学 + 贪心

吃可爱长大的小学妹 提交于 2020-02-01 00:12:07
题目传送门 题意: n个数的序列a 和 m个数的序列b。 序列b全是素数。 出现在序列b中的数全是坏素数。不出现在序列b中的数全是好素数。 有一种操作:选择任意一段区间[1,r],即某一段前缀,设d是这段区间的gcd,让这段区间的数全部除d。 有一个函数 : 。 , p是s的最小质因子,且p是好素数。 , p是s的最小质因子,且p是坏素数。 你可以进行任意次操作,也可以不操作。 计算 的最大值。 题解: 分析函数 可以知道 等于x的好素因子个数 减去 x的坏素因子个数。 还需要知道:前缀的gcd是不增的。即设 1 <= i < j <= n,假设你先进行[1,i]操作,在进行[1,j]操作,那么[1,j]操作将毫无意义。但是反过来就有可能更优。 因此你倒着做,即从下标大到下标小的顺序遍历a序列。 设你遍历到 ,假如[1,i]进行操作更优,那么就进行这个操作,否则不进行这个操作。 感受: 这题看着真唬人,我一看就不会,就去看题解去了。 分析下来不难,但是要发现一些重要的条件。 代码: #include<bits/stdc++.h> using namespace std ; typedef long long ll ; typedef pair<int , int> pii ; const int maxn = 5005 ; map<int , bool> used ; int n

问题 A: 素数

余生长醉 提交于 2020-01-30 22:10:57
问题 A: 素数 时间限制: 1.000 Sec 内存限制: 32 MB 提交: 1114 解决: 379 [ 提交 ] [ 状态 ] [命题人:外部导入] 题目描述 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。 输入 输入有多组数据。 每组一行,输入n。 输出 输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。 样例输入 Copy 70 样例输出 Copy 11 31 41 61 #include <iostream> #include <stdio.h> #include <vector> #include <stdlib.h> using namespace std; bool isSu(int m) { for(int j=2; j<m; j++) { if(m%j==0) return false; } return true; } int main(int argc, char *argv[]) { int n; while(scanf("%d",&n)!=EOF) { vector<int> aa; for(int i=2; i<n; i++) { if(isSu(i)&&(i-1)%10==0) {

10:素数对

你说的曾经没有我的故事 提交于 2020-01-29 23:16:48
总时间限制: 1000ms 内存限制: 65536kB 描述 两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。 输入 一个正整数n。1 <= n <= 10000。 输出 所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。 样例输入 100 样例输出 3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73 # include <iostream> # include <cstring> # include <string> # include <math.h> using namespace std ; bool isPrime ( int a ) { if ( a == 1 ) return false ; if ( a == 2 || a == 3 ) return true ; for ( int i = 2 ; i <= sqrt ( a ) ; i ++ ) { if ( a % i == 0 ) return false ; } return true ; } int main ( ) { int n ; cin >> n ; bool flag = false ; for ( int i = 3 ; i <= n ; i ++ ) {

Java用筛子法求素数

空扰寡人 提交于 2020-01-29 10:55:50
描述现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。 如果输入的整数本身就是素数,则输出该素数本身,距离输出0 输入 第一行给出测试数据组数N(0<N<=10000) 接下来的N行每行有一个整数M(0<M<1000000), 输出 每行输出两个整数 A B. 其中A表示离相应测试数据最近的素数,B表示其间的距离。 样例输入 3 6 8 10 样例输出 5 1 7 1 11 1 1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 int T; 6 Scanner scanner=new Scanner(System.in); 7 int number; 8 int result; 9 int distance; 10 int temp; 11 int N=1000010; 12 int flag[]=new int[N]; 13 int i; 14 int j; 15 16 for(i=0;i<N;i++) 17 flag[i]=0; 18 19 flag[0]=1; 20 flag[1]=1; 21 22 for(i=2;i*i<N;i++){ 23 if

洛谷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为右端点

素数求取的注意事项

我的梦境 提交于 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

pta乙级 1007素数对猜想 java

╄→尐↘猪︶ㄣ 提交于 2020-01-29 00:22:32
输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 //1007 import java . util . Scanner ; public class Main { public static void main ( String [ ] args ) { Scanner in = new Scanner ( System . in ) ; // 输入上限数N int N = in . nextInt ( ) ; // 数素数对个数npd int npd = 0 ; // 素数检验数p int p = 0 ; // 素数暂存数temp int temp = 2 ; if ( N >= 3 ) { for ( int i = 3 ; i <= N ; i += 2 ) { for ( int j = 2 ; j * j <= i ; j ++ ) { if ( i % j == 0 ) { p ++ ; } } if ( p == 0 ) { if ( i - temp == 2 ) { npd ++ ; } temp = i ; } p = 0 ; } } System . out . println ( npd ) ; } } 主要是最后一个测试点超时的问题。偶数不可能是素数,把步长改成2

素数筛(筛选出一定范围内的所有素数)

*爱你&永不变心* 提交于 2020-01-28 19:45:50
鄙白第一篇博客,完完全全仅供纯白白借鉴, 如侵必删。 素数筛字面意思就是筛选某范围内(l,r)的素数嘛。 那怎么筛呢。其思想就是 把范围内的合数都筛去,不就只剩下素数了。而任何合数都可以表示为素数的乘积。因此,如果一个数是素数,那么这个素数的倍数一定是合数。上代码! bool isprime[MAX]; //给数做标志,是素数则为1,不是则为0 long long su[MAX]; //把素数都存入该数组,当然你也可以用STL容器存储 void prime(){ cnt=1; //用来计素数个数 memset(isprime,1,sizeof(isprime)); //先初始化所有数的标志都是1 isprime[0]=isprime[1]=0; //0和1不是素数 for(long long i=2;i<=MAX;i++){ if(isprime[i]) //如果是素数,就保存到su[MAX]里 { su[cnt++]=i; for(long long j=i*2;j<=MAX;j+=i){ //该素数的倍数都是合数,标记为0 isprime[j]=0; } } } 思路很清晰。但很明显,这个效率很低,因为会有重复计算。比如:当i=2时,j=i*2+2=6。而当i=3时,j=i*3=6;如此往后,庞大的数就会有庞大的重复计算量。 因此我们来优化一下