php怎么判断质数,编程输入一个正整数?
#include"stdio.h"#include"math.h"intmain(){intd;inti,j;boolm=true;printf("输入一个正整数:")
;scanf("%d",&d);i=2;while(i<=sqrt(d)){if(d%i==0){m=false;break;}i=i+1;}if(m)printf("Yes")
;elseprintf("No");}
如何快速判断一个三位数是质数还是合数有没有更简单的?
①看看末尾是否为0,2,4,6,8,5,如果是,它就不是质数,末尾为5,5肯定是它的因数,如555,末尾为其它,为偶数,2肯定是它的因数,如360,288等。
②该三位数的各位数字相加是否是3的倍数,如是,该数为合数,如123各位数字相加为6,所以3是它的因数。
又如653,各位数字相加为14,不是3的倍数,它是质数。
如何判断一个数是质数和合数?
找这个数的所有因数,有除了1和它本身以外的,就是合数,只有1和它本身的,就是质数
计算机怎么求质数?
完全遍历法:这种算法比较基本,对于每个数n,将n依次从2除到n,然后对余数进行比较,如果余数是0,则除得尽,如果不是0则除不尽,按照质数的定义,只有1和他本身能成为因数也就是除得尽,所以只有除得尽的数不大于两个时,才能是质数。
这种算法的好处是符合大多数人的第一反应,和定义契合得比较好,也比较省空间,但问题是假如我这里n输入了1000000+时,这个运算时间是非常长的,其算法复杂度高达1*10^12,小数据可以用遇到大数据就很难实现高效了。
开根号遍历法
仔细分析算法我们会发现,其实在做除法运算时不需要除每一个数,只要除到根号n即可。这是因为当除数大于根号n时,其结果肯定是小于根号n的(可以用反证法证明),假如此时能除得尽,那么该种可能早就在小于根号n的遍历中被排除掉了,就没有意义了。这样就减小了一部分算法复杂度。
筛选法
筛选法的核心是牺牲内存换速度,因为其不通过遍历来表达一列数而是直接通过数组来表达。用静态的bool量去变现数的状态。
其核心流程为:
定义一个bool数组,其下标为我们要判断的数,其值为true。表示初始阶段所有数都假定是素数。
开始对这个数组进行筛选(及把值改为false),实现把因数含有2的所有数筛掉,把因数含有3的数筛掉,把因数含有5的数筛掉…一直筛选到只剩下素数为止。
这种方法运算效率非常高,特别是在十万级以上的数中,其牺牲掉的内存不多,但对速度的提升确实是非常显著的。
什么是质数讲解?
质数是指一个数只要1和本身两个因数的数。比如:2的因数有1、2。所以2是质数。
按质数的意义,我们可以根据一个数因数的个数来判断一个数是不是质数。比如31是质数吗?我们只要想31除了1和31之外没有别的因数,所以31是质数。
我们至少要熟记20以内的质数2、3、5、7、11、13、17、19共8个。除2以外的质数都是奇数,2是唯一一个既是偶数又是质数的数。