判断素数

C语言I博客作业05

不问归期 提交于 2019-12-02 05:42:56
这个作业属于哪个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在哪个具体方面帮助我实现目标 参考文献 C语言程序设计II C语言I—2019秋作业05 , C语言作业评价标准 熟悉并掌握基本的程序语言,拥有独立完成能力 进一步强化C语言的基础学习,学习掌握自定义函数,同时通过PTA作业了解自定义函数在实际编程语言中的应用 集美大学林丽老师 , 思维导图 , 百度百科 1.PTA实验作业 1.1 题目名    本题要求实现一个函数,判断任一整数是否为水仙花数 (必须是三位数,且数的每一位上数字的立方和与数本身相等) 例如153=1^3+5^3+3^3=1+125+27=153,而1或155则不是水仙花数。如果是水仙花数,则函数返回1,否则返回0. 1.1.1 数据处理    ①数据表达:使用了整形常量a,b,c,分别作为输入三位数数据的个位十位百位;    ②数据处理:使用了 if else选择语句 ,若符合条件返回1,不符合返回0。    ③函数参数:主调函数是 “int main()” 被调函数是 “int func(const int N)” 是整形函数‘实参是N,形参是a,b,c,它们都是整形。 1.1.2实验代码截图 1.1.3 造测试数据 输入数据 输出数据 说明 100 0 最小三位数100 99 0 使用非三位数 999 0 最大三位数999 153 1

判断素数(质数)

巧了我就是萌 提交于 2019-12-01 20:10:47
import math def isPrime(num): if num==5 or num==7: return True elif num%5==0 and num%7==0: return False else: for n in range(3,int(math.sqrt(num))+1): if num%n==0: return False return True 来源: https://www.cnblogs.com/pandas-blue/p/11716070.html

筛素数

送分小仙女□ 提交于 2019-12-01 16:16:22
1.判断一个数是否为素数   对于n   i从2到sqrt(n)依次尝试若不存在i使得n%i==0则为素数   反之则不是   时间复杂度sqrt(n)   或者   有结论:大于等于5的素数可以表示成6*n-1或6*n+1   所以可以用该方法来判断素数 void isprime(int x){ if(x==0||x==1)return 0; if(x==2||x==3)return 1; if(x%6!=1&&x%6!=5)return 0; if(x==4)return 0; for(int i=5;i*i<=n;i+=6){ if(x%i==0||x%(i+2)==0)return 0; } return 1; } 2.埃氏筛法   素数的倍数一定不是素数   由此可以筛素数 void tprime(){ memset(p,true,sizeof p); p[0]=p[1]=0; p[2]=1; for(int i=2;i<=maxn;i++){ if(p[i]){ for(int j=2*i;j<=maxn;j+=i){ p[j]=0; } } } } 3.欧拉筛法   每个数只会被它最小的质因子筛去   背过代码就行了(逃   void oprime(){ p[1]=p[0]=0; for(int i=2;i<=maxn;i++){ if(!vis[i]){ p[+

判断素数

╄→гoц情女王★ 提交于 2019-12-01 11:24:40
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。 思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。 原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 ,另一个大于或等于 。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=√16,因此只需判定在 2~4 之间有无因子即可。 两种思路的代码请看解析。 思路1) 的代码: #include <stdio.h> int main(){ int a=0; // 素数的个数 int num=0; // 输入的整数 printf("输入一个整数:"); scanf("%d",&num); for(int i=2;i<num;i++){ if(num%i==0){ a++; //

高效求解素数

本小妞迷上赌 提交于 2019-12-01 10:23:35
给出一个正整数,求出2-正整数之间的所有素数。所谓素数,就是除了1和它本身外不能被任何数整除的数。 素数求解的问题是刚开始接触C语言就接触到的简单问题,也许你会写出下面的代码: int Prime_num(int end_num) // 求解从1-end_num间的所有素数 { int result = 0; for(int i = 2; i < end_num; ++i){ if(IsPrime(i)){ ++result; } } return result; } bool IsPrime(int num) // 判断num是否为素数 { int i; for(i = 2; i < num; ++i){ if(!(num % i)){ return false; } } return true; } 该代码套用两层循环,从2遍历至end_num,对每一个数进行素数判断。时间复杂度O(n^2)。 但是我们发现该算法在判断num是否为素数还有可优化的地方 比如当num = 12 时判断num是否为素数: 12 = 2 * 6 12 = 3 * 4 12 = sqrt(12) * sqrt(12) 12 = 4 * 3 12 = 6 * 2 观察到以sqrt(12)为分界点,前后是相同的乘积式,这样我们只需要在IsPrime()函数中遍历到sqrt(num)就好了呢。 好了

计算素数

孤街浪徒 提交于 2019-12-01 10:19:09
题目:计算0-100的所有的素数。 素数:素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 很容易得出下面的代码 def get_prime(n): res = [] for i in range(2, n): for j in range(2, i): if i % j == 0: break else: res.append(i) return res 求素数 但是经过分析,我们发现完全可以利用已知的信息,如果一个数不是素数,那么它的所有整数倍也肯定不是素数,因此,我们只需要判断,它是否是素数的整数倍就可以了。 然后经过优化后的代码可以写成: def get_prime1(n): res = [] for i in range(2, n): for j in res: if i % j == 0: break else: res.append(i) return res 求素数(优化) 来源: https://www.cnblogs.com/walle-zhao/p/11680269.html

例子:列表--素数问题

纵然是瞬间 提交于 2019-12-01 10:01:49
求100以内的素数。 在这里我们可以使用列表来做,首先,先判断该数是不是素数,即只能被1和自己整除,然后使用列表的append()函数,逐个添加。 1 lst_su = [] 2 for a in range(2,100): 3 for b in range(2,a): 4 if a % b == 0: 5 break 6 else: 7 lst_su.append(a) 8 print(lst_su) 9 ################################### 10 lst1 = [2] 11 for a in range(3,100): 12 for b in lst1: 13 if a % b == 0: 14 break 15 else: 16 lst1.append(a) 17 print(lst1) 18 #################################### 19 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/shuzi.py 20 [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] 21 [2, 3

线性筛--如何线性求约数个数

无人久伴 提交于 2019-12-01 09:26:48
线性筛--如何线性求约数个数 线性筛1654948748 我已经掌握埃氏筛了 为什么还要学线性筛??? 线性筛的时间复杂度是严格 O ( N ) O(N) 的, 而埃氏筛的复杂度是 O ( N ∗ l o g 2 ( l o g 2 ( N ) ) O(N∗log2(log2(N)) 看上去并没有快多少 实际也是 , 但在处理一些大数据时,差距就凸显出来了 算法思路 概述: 和埃氏筛类似的 线性筛是通过枚举到的当前数字乘以某个比该数的最小质因子还小的质数来筛的 (上面这句话有点长, 需要反复理解 暂时不能理解,也没关系,等下代码中我会详细讲的 ) 这样就可以保证每次几乎不会出现重筛的情况,大大减少了循环次数 代码: #include<bits/stdc++.h> using namespace std; #define re register #define ll long long #define in inline #define get getchar() int read() { int t=0; char ch=get; while(ch<'0' || ch>'9') ch=get; while(ch<='9' && ch>='0') t=t*10+ch-'0',ch=get; return t; } const int _=1e7+6; int prime[_],

博客作业

岁酱吖の 提交于 2019-12-01 06:12:28
一.思维导图 [思维导图] 二.语法认识 1.if_else语句 使用方法: if(条件1) { 语句1; } else { 语句2; } 遇到的问题: 对于if和else的两两配对理解不够,导致程序判断结构异常。 解决方法: 牢记else和if的匹配准则:else与最靠近它的、没有与别的else匹配过的if相匹配。并在编辑代码时采用多层缩进的书写格式,使判断结构层次分明。 注意事项: else后无需再编辑条件,为养成良好的编辑习惯,if-else语句的大括号要打出来。 2.switch语句 使用方法: switch(整形表达式) { case 常量表达式1: 语句1;break; case 常量表达式2: 语句2;break; … case 常量表达式n: 语句n;break; default: 语句n+1; } 遇到的问题: 过于依赖switch,导致有时编辑出的代码质量不好,不便于检查和后期的程序维护。 解决方法: 在解决问题时只在switch语句的优势十分明显时使用switch语句,慎用、智用switch语句。 注意事项: switch语句中的break语句并不是每个case语句后都必须有, 这个机制可以让switch语句的用途大大增加,所以要在switch语句中智慧的安排break的位置。 3.for语句 使用方法: for(表达式1; 表达式2; 表达式3) {

ACM周末总结—10月22日

佐手、 提交于 2019-12-01 03:42:42
这个半周继续学习了数学的内容,在整理一下吧。其实感觉直接复习高代好像也可以。 筛素数: 理论:任何一个正整数都可以被唯一的分解为若干个素数的乘积; 取出容器中最小的数(此数一定是素数),删去所有该数的倍数。 int n; bool vis[1005]; cin>>n; memset(vis,true,sizeof(vis)); vis[0]=false;vis[1]=false; for(int i=2;i<=n;i++){ if(vis[i]==false) continue; for(int j=i*2;j<=n;j+=i){ vis[j]=false; } } 筛素数改进: 因为普通筛素数方法速度是比较慢,因为同一个数可能处理好几次(2,3,都是12的因子),任何一个数都有一 个可以被整除的最小素数(除去1),当遇到该素数是时就结束更新。 int flag=0,n; memset(isprim,0,sizeof(isprim)); cin>>n; for(int i=2;i<n;i++) { if(!isprim[i]) prim[flag++]=i; for(int j=0;(j<flag)&&(i*prim[j]<n);j++) { isprim[j]=1; if(i%prim[j]==0) break;//就用这部来节省时间 } } 欧拉函数: 计算比x(正整数