pat-1059 Prime Factors (25分)

1059 Prime Factors (25分)
pat-1059 Prime Factors (25分)_第1张图片

//质因子分解,里面涉及到了前面的素数判断 
#include 
#include 
using namespace std;
const int maxn=100010;
int prime[maxn],pNum=0;
//pNum:记录的位置索引上的素数 
//素数判断 
bool isPrime(int n){
	if(n<=1) return false;
	for(int i=2;i<=(int)sqrt(1.0*n);i++){
		if(n%i==0) return false;
	}
	return true;
}
//记录素数,素数放到里面,然后根据索引找到索引所对应的素数 
void find_Prime(){
	for(int i=1;i<maxn;i++){
		if(isPrime(i)==true){
			//记录数组下表从零开始,然后记录素数的顺序 
			prime[pNum++]=i;
		}
	}
}
//记录每个质因子,并且记录质因子出现的次数。
//开辟质因子数组,其实可以证明只要结构数组开辟到10就可以了 
struct factor{
	int x;//从小到大记录质因子 
	int time;//记录质因数出现的次数 
}fac[10]; 
//比如:9进行质因子分解,为3*3.那么x=3,time=2 
int main(){
	find_Prime();//务必要写,从一开始就把质因子的表的做好。算是缓存的作用 
	int n,num=0;
	cin>>n;
	if(n==1) cout<<"1=1";
	else{
		printf("%d=",n);
		for(int i=0;i<pNum&&prime[i]<=(int)sqrt(1.0*n);i++){	
			//说明能够除得尽,开始去记录质因子 
			if(n%prime[i]==0){
				fac[num].x=prime[i];
				fac[num].time=0;
				while(n%prime[i]==0){
					fac[num].time++;
					n/=prime[i];
				} 
				num++;
			} 
			if(n==1) break;
		}
		if(n!=1){
			fac[num].x=n;
			fac[num++].time=1;
		}
		for(int i=0;i<num;i++){
			if(i>0) cout<<"*";
			cout<<fac[i].x;
			if(fac[i].time>1) printf("^%d",fac[i].time);
		}
	}
	return 0; 
}

考察数论(素数和质因子),其实的知识讲解,请参考(写了一大半,呜呜呜,先留一个空,后面完整补上)

你可能感兴趣的:(pat甲级,算法,数据结构,字符串)