质数与合数及其应用

质数与合数

摘自维基百科:

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

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

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

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

在阶乘中的应用

问题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;

质数与合数及其应用

时间: 2024-11-05 13:29:35

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

python 判断质数还是合数

while 1: s = input('请输入一个数:') s = int(s) if s == 2: print('质数') else: if s == 0 or s == 1: print('都不是') else: u = s - 2 h = 1 p = 1 while u: h = h + 1 if s % h == 0: p = 1 break else: p = 0 u = u - 1 if p: print('合数') else: print('质数')

输出100以内奇数,偶数,质数,合数的脚本

奇数#!/bin/bash echo " ( 1..100 )内的奇数:"for i in {1..100};doA=$(expr $i % 2)        if [ $A -ne 0 ];then                echo $i        fidone 偶数#!/bin/bash echo " (1-100) 内的偶数:"for i in {1..100};doA=$(expr $i % 2)        if [ $A -eq 0 ]  

求质数的方法解析

质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数.比1大但不是素数的数称为合数.1和0既非素数也非合数.合数是由若干个质数相乘而得到的.所以,质数是合数的基础,没有质数就没有合数. 求素数的方法有很多种,最简单的方法是根据素数的定义来求.对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数. 但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其

质数筛法详解

理论及实现 定义: 若一个正整数无法被除了1和它本身的之外的任何自然数整除,则称该为质数(素数),否则称该正整数为合数. 判定方法 试除法 引理: 若一个正整数\(N\)为合数,则存在一个能整除\(N\)的数\(T\)且\(2≤T≤ \sqrt N\) 证明就不再赘述,读者可以自行验证: 因此,我们只需要枚举\(2-\sqrt N\).只要这之中的所有数都不能被\(N\)整除,那么\(N\)就是质数了: #include<cmath> bool is_prime(int n) { if(n &

MySQL3-分区与分表

目录 零.主要参考网页 一.概述 二.分区类型以及创建方式 三.分区表的管理 四.获取分区表信息 五.分区的局限与分表 零.主要参考网页 http://www.2cto.com/database/201503/380348.html[mysql分表和表分区详解] http://www.cnblogs.com/zemliu/archive/2013/07/21/3203511.html[MySQL分区表] http://x125858805.iteye.com/blog/2068120[MYSQL

分解质因数的技巧

背景: 有时分解一个很大的合数,因为可能质因子很大,导致分解时复杂度不是严格O(log2n),需要用一点技巧使其复杂度得到保证. 做法: 在筛法求质数时,不用把质数存储成一张表,而用一个数组big[i]保存每个数(不管是质数还是合数)的最大质因数,接着在分解一个数x时,令y=x,之后不断地y/=big[y],并且把每次的big[y]作为x的一个质因数,这样就可以了. 20161115

反素数 -- 数学

反素数就是区间内约数个数最多的那个数. 在ACM题目里, 一般是求约数最多而且数字最小的那个数,[1--n] 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数[beign,end] 1和3有区别吗?有,1可以加速,3只能暴力 先说下思路 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. (2)我们可以知道,计算约数的个数和质因数分解有着很大的联系: 若Q的质因数分解为:Q=p1^k1*p2^k2*…*pm^km(p1…pm为素数,k1…km≥1),则Q有(k1+1

2017.8.9数论课小结

一.先是一些整除的性质: ?整除:若a=bk,其中a,b,k都是整数,则b整除a,记做b|a. ?也称b是a的约数(因数),a是b的倍数 ?显而易见的性质: ?1整除任何数,任何数都整除0 ?若a|b,a|c,则a|b+c, a|b-c ?若a|b,则对任意整数c,a|bc ?传递性:若a|b,b|c,则a|c 例1: ?例题:[CF 762A]k-th divisor ?求n的第k小的约数.如果不存在输出-1 ?1 ≤ n ≤ 10^15, 1 ≤ k?≤?10^9 分析:这道题显然不能用O(

GCD Guessing Game Gym - 100085G 猜数字 gcd

http://codeforces.com/gym/100085/attachments 因为那个数字是一个质数,这样的猜的次数是最多的,所以至少是质数次. 但是如果需要猜2.3,那么可以直接猜6,也能达到猜2和3的效果. 想要猜7.11,那么可以猜77,会产生gcd = 7的有7.49.77,gcd = 11的有11.77 所以相当于把1--n的质数分组,每组的乘积不能超过n,求最小的组数. #include <bits/stdc++.h> #define IOS ios::sync_wit