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、一个合数的质因数分解的结果是唯一的,因此与分解的顺序无关。