5.13分解质因数

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

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/6784561.html