C++实现质因数分解
来源:互联网 发布:监控对方手机屏幕软件 编辑:程序博客网 时间:2024/06/05 19:20
质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
质因数(或质因子)在数论里是指能整除给定正整数的质数。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数。综上所述质因数分解是唯一的。
质因数分解的经典算法是:
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
一个合数的最小正因子必小于根号N。
对于上面定理的简单思考证明:
首先,约数是成对出现的。比如24,你找到个约数3,那么一定有个约数8,因为24/3=8。
然后,这对约数必须一个在根号n之前,一个在根号n之后。因为都在根号n之前的话,
乘积一定小于n(根号nX根号n=n),同样,都在根号n之后的话,乘积一定大于n。
所以,如果你在根号n之前都找不到约数的话,那么根号n之后就不会有了。
如果N (N>=2)没有小于等于根号N,大于1的约数,那么N必然是质数。
假设N不是质数,并且不含有小于等于根号N的约数。
因为N是合数,那么N必然可以写成N=p*q,并且p和q大于1。根据假设,p和q都大于根号N。那么p*q>N,矛盾
具体程序:
程序用到了cmath头文件。cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数。
cmath库函数列表:
#include<cmath>
using namespace std;
void PrimeDecomposition(int k)
{
cout<<k<<"=";
if(k<2)
cout<<"不能够进行质因数分解"<<endl;
else if(k==2)
cout<<"2*1"<<endl;
else
{
for(int i=2;i<sqrt(k);i++)
{
while(k!=i)//这里用while循环是考虑到质因子中有可能有重复个i的情况
{
if(k%i==0)
{
cout<<i<<"*";
k=k/i;
}
else
break;
}
}
cout<<k<<endl;
}
}
//另外一种写法
/*void Analyse(int n)
{
//首先输出等式左边部分
cout<<n<<" = ";
//对n进行质因数分解,应先找到一个最小的质数2
//如果这个质数恰好等于2,则说明分解质因素的过程结束,打印
if(n == 2)
{
cout<<n<<endl;
}
//n小于2时,无法进行质因素分解,提示相应信息
else if(n < 2)
{
cout<<"该数不可以分解质因素"<<endl;
}
else
{
//如果n>=k,但n能被k整数,则打印出k的值
for(int i = 2;i <= sqrt(static_cast<double>(n));i++)
{
if(n % i == 0) //关键在于这里没有用上面的while循环了,改用i--来检测是否有重复的质因子
{
n = n/i;
cout<<i<<"*";
//重复执行上一步
i--;
}
}
cout<<n<<endl;
}
} */
int main()
{
int n=90;
PrimeDecomposition(n);
return 0;
}
- C语言实现分解质因数
- C语言实现 N!的质因数分解
- 初级C语言算法实现分解质因数
- [C/C++] 分解质因数
- C语言分解质因数
- C分解质因数
- 【C语言】分解质因数
- c算法-分解质因数
- c语言:分解质因数
- C语言分解质因数
- C语言-分解质因数
- C语言-分解质因数
- 【c语言】分解质因数
- C语言 > 分解质因数
- C++实现质因数分解
- java实现分解质因数
- 水仙花数&素数&质因数分解的C语言实现
- 分解质因数程序(C++)
- 使用dsoframer控件出现"Unable to display the inactive document. Click here to reactivate the document."的问题
- jQuery信息提示工具[Poshy Tip]
- java网络编程基础Socket通信应用
- Android - 动画 - 位移 - XML
- Java和Tomcat类加载机制
- C++实现质因数分解
- 二叉树的相关操作
- C++学习笔记-数组引用
- win7 开启telnet
- Centos7下配置node.js环境
- Troubleshooting Database Startup/Shutdown Problems (Doc ID 851057.1)
- 第10周项目4大奖计分赛
- 第十周项目四——评分
- Make CapsLK as an additional Ctrl @ Ubuntu 14.04+