Q:任何一个合数可以写成几个质数相乘的形式,这几个质数都叫做这个合数的质因数。例如 24=2*2*2*3.
编写一个程序,实现分解质因数。
方法一:
根据《分解质因数》http://www.cnblogs.com/youxin/p/3232049.html这篇博客学习所得。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<n<<"=";
for(int i=2;i<=n;i++)
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
cout<<n;
}
补充,若是用上述方法还可以解决某个范围内数的质因数分解。
#include<iostream>
using namespace std;
int n;
int f(int n) {
cout<<n<<"=";
for(int i=2;i<n;i++) {
while(n!=i) {
if(n%i==0) {
n=n/i;
cout<<i<<"*";
}
else
break;
}
}
cout<<n;
cout<<endl;
return 0;
}
int main() {
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
f(i);
return 0;
}
方法二:
先来学习判断一个数据是否是质数。
判断质数
//方式一
int isPrime(int n) { if(n==1) return 0; else if(n==3 || n==2) return 1; else { for(int i=2;i<n;i++) { if(n%i!=0) { return 0; } return 1; } } }
//方式二
int isPrime(int n) {
for(int i=2;i<=n-1;i++)
if(n%i==0) return 0;
return 1;
}
全部程序:
#include <iostream>
using namespace std;
int isPrime(int n) {
for(int i=2;i<=n-1;i++)
if(n%i==0) return 0;
return 1;
}
void PrimeFactor(int n) {
if(isPrime(n)) cout<<n<<" ";
else {
for(int i=2;i<=n-1;i++)
if(n%i==0) {
cout<<i<<" ";//第一个因数一定是质因数
if(isPrime(n/i)) {//判断第二个因数是否是质数
cout<<" "<<n/i;
break; //找到全部质因子
}
else
PrimeFactor(n/i);//递归调用函数来分解n/i
break;
}
}
}
int main() {
int a;
cin>>a;
PrimeFactor(a);
return 0;
}
注意:
1、若从2开始到n-1顺序查找n的因数,那么第一个找到的因数i一定是质因数。eg:24=2*12
证明:2是质因数。反证法,假设i不是质因数,则i除了1和i还会有其他的因数,即存在p、q属于[2,N-1]使得p*q=i。 因此pq(n/i)=n, 因此p、q也是n的因数。但我们从2开始递增求n的因数,又因为i是第一个找到的因数,所以在i之前不会有其他的因数,所以结论与题 设产生矛盾。
2、一个合数的质因数分解的结果是唯一的,因此与分解的顺序无关。