您的位置:首页 > 编程语言 > C语言/C++

C++学习之分解质因数

2015-09-15 14:21 405 查看
一般地,对于一个大于1的非质数N,都可以分解成1~N之间质数相乘的形式,例如:

6=2*3;

30=2*3*5;

72=2*2*2*3*3;

......

特殊地,当N是质数时,则只能表示成N=1*N的形式。

本文就该形式的分解,给出了分解质因数的C++源代码:

//分解质因数.cpp
//功能:将一个整数分解为多个质数相乘
//例子:480=2*2*2*2*3*5
//日期:2015/09/15
#include<iostream>
#include<cmath>
using namespace std;

//判断是否为质数
bool isPrime(int num)
{
if(num<2)
{
cout<<"Error!"<<endl;
return false;
}
if(num==2 || num==3)
return true;
int N=sqrt(num);
bool flag;
for(int k=2;k<=N;k++)
{
flag=1;
if(num%k==0)
{
flag=0;
break;
}
}
return flag;
}

//获取在2到sqrt(x)之间的质数的个数
int getNumberOfPrime(int x)
{
int count=0;
for(int k=2;k<=x/2;k++)
if(isPrime(k))
count++;
return count;
}

//将在2到sqrt(x)之间的质数保存在数组中
int *savePrime(int x,int Num)
{
int *p=new int[Num];	//动态创建数组存放质数
int count=0;
for(int k=2;k<=x/2;k++)
{
if(isPrime(k))
p[count++]=k;
}
return p;
}

//分解质因数
void solve(int x,int p[],int Num)
{
cout<<x<<'=';
if(isPrime(x))		//如果是质数
cout<<"1*"<<x;
else
{
int count=0;			//数组下标
bool flag=1;			//输出格式标志
while(count<Num)
{
if(x%p[count])		//如果不能被整除,count=count+1
count++;
else
{
if(flag)		//如果分解得到第一个质因数,则直接输出该质因数
{
cout<<p[count];
flag=0;		//让flag置0
}
else
cout<<'*'<<p[count];
x/=p[count];	//更新x
}
}
}
cout<<endl;
}

//主函数
void main()
{
int x=1651650;	//x为被分解的整数
int Num=getNumberOfPrime(x);
int *p=savePrime(x,Num);
solve(x,p,Num);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: