质数与合数及其应用

质数与合数

摘自维基百科:

质数,又称素数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数)。

比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着非常重要的地位。

质因数分解 即 分解质因数 。每个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。 分解质因数只针对合数。分解质因数的算式的叫短除法

更多知识请点击维基链接:http://zh.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

在阶乘中的应用

问题1

求N!末尾0的个数

方法1.采用质因数分解法。

//统计 1-N 中被5整除的因子的总个数
int FindZeroNum(int N)
{
    int nCount = 0;
    for (int i = 5;i < N + 1;i++)
    {
        int nCur = i;
        while(nCur % 5 == 0)//统计nCur中被5整除的因子的个数,即有几个5
        {
            nCount++;
            nCur /= 5;
        }
    }
    return nCount;
}

方法2.

N!中含有的质因数k的个数为:[N/k]+[N/k^2]+[N/k^3]+...

其中,[N/k]表示不大于N的数中(1--N)k的倍数贡献一个k

[N/k^2]表示不大于N的数中k^2的倍数贡献一个k

......

int FindZeroNum(int N,int k)//求N!中含有多少个质因子k
{
    int nCount = 0;
    while(N)
    {
        N = N / k; //1-N能奉献多少个k
        nCount += N;
    }
    return nCount;
}

复杂度:O(logkN)。

问题2

求N!的二进制表示中最低位1的位置。

思路:二进制表示中最低位1的位置等价于二进制表示中末尾0的个数+1,进而等价于N!中质因子2的个数+1

FindZeroNum(N,2)+1;

作者:csdn博客 Duplan

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 因子分解
, 素数
, 质数
, c++ 求素数问题
, 5项因数
, 求素数
, 个数
, 求50以内的素数
, 被3整除的数
, 被7整除的数
, 质因数
, 求n以内的素数
合数
质数和合数、什么是质数和合数、质数和合数教学设计、0是质数还是合数、质数合数,以便于您获取更多的相关知识。

时间: 2024-09-10 11:34:42

质数与合数及其应用的相关文章

解析利用javascript如何判断一个数为素数_javascript技巧

判断是否为素数? 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. 合数,数学用语,英文名为Composite number,指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数.与之相对的是质数(因数只有1和它本身,如2,3,5,7,11,13等等,也称素数),而1既不属于质数也不属于合数.最小的合数是4. <!DOCTYPE html> <html lang="en">

判断一个数是质数的优化算法

问题描述 判断一个数是质数的优化算法 判断1000 000 00内的一个数是否是素数,比较优化一点的,i从2到sqrt(i)循环判断,效率不行,希望大神指点. 解决方案 用一个表记录下已经找到的素数,判断更大的数的时候,只要判断2~sqrt(i)范围内素数表上的数就可以了.因为一个数如果可以被一个合数整除,必然可以被由它构成的素数整除. 具体算法http://blog.csdn.net/liukehua123/article/details/5482854 解决方案二: 可以参考以下链接 htt

c++-C++用递归方式输出100以内的质数

问题描述 C++用递归方式输出100以内的质数 要求用递归方式求100以内的质数,并且打印出来,每5个一行 解决方案 #include using namespace std; bool isPrime(int i){ for(int j=2;j<=i/2;j++){ if (i%j == 0){ return false; } } return true; } int main(void){ for(int i=2;i<100;i++){ if(isPrime(i)){ cout<&l

素数-求质数并打印,下面是我的写法,求改进,求其他写法

问题描述 求质数并打印,下面是我的写法,求改进,求其他写法 package test; import java.util.Scanner; public class TestPrime { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入一个整数"); int num=sc.nextInt(); System.out.println(&q

JavaScript判断数字是否为质数的方法汇总_javascript技巧

前言 今天看到一个题目,让判断一个数字是否为质数.看上去好像不难.因此,我决定实现一下. DOM结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>计算500以内的质数并输出</title> <meta name="viewport" content="width=d

c# 判断质数与素数之学习笔记

比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一 要求:重复让用户输入输入一个数,判断该数是否质数,当输入"q"时,程序运行结束!(质数的判断要求用方法来实现).  代码如下 复制代码 class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数:");//默认只许输入"q"或者输入大于1

ruby判断一个数是否为质数(素数)示例_ruby专题

ruby判断一个数是否为质数 质数又称素数.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数:(除0以外)否则称为合数 .根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的. 复制代码 代码如下: def prime?(num)  res = [1]  res << num   if num == 0 || num == 1    return false  end   2.u

求100以内的质数,值得一看

问题描述 刚才看了一个招聘求100以内的质数问题,去求职的要求差不多都在7500/M以上,更有甚者要到12000/M,其实算法有很多种我贴出自己的算法,要价:4500/public static void main(String[] args) {for(int i=1;i<=100;i++){int flag = 0;for(int j=1;j<=i;j++){if(i%j==0){flag++;}}if(flag>2){continue;}else {System.out.print

java求100之内的素数(质数)简单示例_java

质数又称素数.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数:否则称为合数.根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.下面是一个java求100之内的素数简单示例 复制代码 代码如下: public class test {  public static void main(String[] args) {  int i,n,k=0;     for (n = 3;