素数

C/C++素数判断

时光总嘲笑我的痴心妄想 提交于 2020-01-28 05:25:57
改进代码,判断方式很巧妙。 # include <stdio.h> # include <stdlib.h> # include <math.h> int main ( ) { int number , limit , i ; printf ( "Input a number:" ) ; scanf_s ( "%d" , & number ) ; limit = sqrt ( number ) ; if ( number == 0 ) { printf ( "False" ) ; } else { for ( i = 2 ; i <= limit ; i ++ ) { if ( number % i == 0 ) break ; } if ( i > limit ) { printf ( "True" ) ; } else { printf ( "False" ) ; } } } 来源: CSDN 作者: 源心锁 链接: https://blog.csdn.net/qq_38331169/article/details/103986934

筛选法求素数

橙三吉。 提交于 2020-01-28 05:10:10
# include <stdio.h> int main ( ) { int arr [ 100 ] , i , j ; for ( i = 0 ; i < 100 ; i ++ ) { arr [ i ] = i + 1 ; } arr [ 0 ] = 0 ; for ( i = 1 ; i < 99 ; i ++ ) { for ( j = i + 1 ; j < 100 ; j ++ ) { if ( arr [ j ] != 0 && arr [ i ] != 0 && arr [ j ] % arr [ i ] == 0 ) arr [ j ] = 0 ; } } for ( i = 0 ; i < 100 ; i ++ ) { if ( arr [ i ] != 0 ) printf ( "%d " , arr [ i ] ) ; } return 0 ; } 来源: CSDN 作者: qq_45923019 链接: https://blog.csdn.net/qq_45923019/article/details/103825305

质因数分解函数

人走茶凉 提交于 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的时候做个判断啊

入门者 pat basic 练习十三 数素数

ⅰ亾dé卋堺 提交于 2020-01-26 03:08:09
题目: 令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 P​M​​ 到 P​N​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 思路: 应该先找到第M个素数和第N个素数,然后在这个区间里遍历找素数,找到素数后就按照格式输出 代码: #include<iostream> #include<cmath> using namespace std; bool isPrime(int num); int main() { int m,n,less_prime,greater_prime,t=2,count_num=0,count_row=0; bool getLess=false; cin>>m>>n; while(true) { if(isPrime(t)) count_num++; if(count_num==m&&!getLess)//getLess的目的是因为count_num可能在几次循环中都是等于m的

ZJNU 1223 - 素数距离——高级

妖精的绣舞 提交于 2020-01-26 01:11:37
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum[i]*prnum[i] 计算出最后一个是prnum[i]的倍数的数 符合条件时,从l到r,每次加prnum[i],标记出所有以prnum[i]为因子的数 因为无法直接开数组标记到大数 但又因为R-L≤1000000 所以可以对位置进行转换 标记时取-L+1,取出时取-1+L 最后将区间内的素数取出放在ans这个vector集合内,对答案进行判断即可 (注意特殊情况的判断) 1 /* 2 Written By StelaYuri 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef long long ll; 7 vector<ll> prnum,ans; 8 bool prim[46400],ar[1000010];

PAT乙级刷题之路1013 数素数 (20分)

你。 提交于 2020-01-26 00:21:13
1013 数素数 (20分) 令 P​i表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 P​M到 PN的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 PM 到 PN的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 # include <stdio.h> # include <math.h> # define MAXNUM 10000 int Isprime ( int n ) { int i , isprime = 1 ; for ( i = ( int ) sqrt ( n ) ; i >= 2 ; i -- ) { if ( n % i == 0 ) { isprime = 0 ; } } return isprime ; } int main ( ) { int N , M ; scanf ( "%d %d" , & M , & N ) ; int A [ N + 1 ] , cnt = 3 , i ; //A数组记录素数 A [ 1 ] = 2 ; A [ 2 ] = 3 ; for ( i = 3 ; i <=

东华oj-基础题第40题

我怕爱的太早我们不能终老 提交于 2020-01-25 19:59:26
40 分拆素数和 作者: xxx时间限制: 1S章节: 函数 问题描述 : 把一个偶数拆成两个不同素数的和,有几种拆法呢? 说明: 比如10,可以拆成3+7和5+5以及7+3, 但是3+7与7+3相同,只算一种,5+5由于两个素数相同,不计算在内。 因此,10的拆法只有一种。 输入说明 : 首先输入一个T(不超过500),然后输入T个正的偶数,其值不会超过10000。 输出说明 : 对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。 输入范例 : 4 4 6 8 10 输出范例 : 0 0 1 1 /* T40 分拆素数和 算法概述:对于一个偶数num,从2到num/2 - 1依次测试拆分是否满足要求 */ #include<stdio.h> #include<math.h> // 判断是否为素数 int isPrim(int x) { int i = 0 ; for ( i = 2 ; i <= sqrt ( x ) ; i++) { if (x % i == 0) { return 0 ; } } return 1 ; } // 构建素数表 void primeArray(int primeFlag[], int n) { if ( n < 2 ) return ; int i = 0, j = 0 ; int count = 0 ; for ( i = 0 ; i <

1013 数素数 (20point(s))

强颜欢笑 提交于 2020-01-25 00:34:32
令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 P​M​​ 到 P​N​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 #include <iostream> #include <vector> #include <iomanip> #include <stdio.h> #include <math.h> using namespace std; int isPrime(int x) { int flag = 1; for(int i = 2; i <= sqrt(x); i++) { if(x % i == 0) flag = 0; } return flag; } int main() { int M, N, cnt = 0, flag = 1; // flag控制格式,cnt记录输出了几个素数 cin >> M >> N; for(int i = 2; i < 200000; i++) { if(isPrime

ZZULIOJ 1092: 素数表(函数专题)

浪尽此生 提交于 2020-01-24 16:33:09
题目描述 输入两个正整数m和n,输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 } 对于C/C++代码的提交,本题要求必须通过定义prime函数和main函数实现,否则,提交编译错误,要提交完整的程序。 输入 输入两个正整数m和n,m<=n,且都在int范围内。 输出 输出占一行。输出m和n之间的所有素数,每个数后有一个空格。测试数据保证m到n之间一定有素数。 样例输入 2 6 样例输出 2 3 5 tips: 1 判断一个数是不是素数,可以从2-n-1,也可以从2-根号n 判断 2 本题从2-n-1判断超时,使用2-根号n #include<stdio.h> #include<stdlib.h> #include<math.h> int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 int i; if ( n==1) //先判断n是否为1,1不是素数 { return 0; } for (i = 2; i <= (int)sqrt(n); i++) //sqrt()返回double,需要强转 ,是否需要=可以带入数,如4

PAT-乙级-1007.素数对猜想

最后都变了- 提交于 2020-01-23 16:38:35
题目 让我们定义 dn 为:dn = pn+1 – pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数 对猜想”认为“存在⽆无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 105),请计算不不超过N的满⾜足猜想的素数对的个数。 输入格式: 每个测试输⼊入包含1个测试⽤用例例,给出正整数N。 输出格式: 每个测试⽤用例例的输出占⼀一⾏行行,不不超过N的满⾜足猜想的素数对的个数。 输入样例: 20 输出样例: 4 解法 核心就是一个素数的判断 # include <iostream> # include <vector> # include <cmath> using namespace std ; int judge ( int n ) //判断是否是素数 { int flag = 0 ; for ( int i = 2 ; i <= sqrt ( n ) ; i ++ ) { if ( n % i == 0 ) { flag = 1 ; break ; } } if ( flag == 1 ) return 0 ; else return 1 ; } int main ( ) { vector < int > v ; int n ; cin >> n ; int count = 0 ; //求出范围内的素数 for ( int i =