1059 Prime Factors

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1059 Prime Factors相关的知识,希望对你有一定的参考价值。

1. 第一次测试点三错误,由于1既不是质数也不是合数,因此对于1来说需要有一个特殊判断,输出:1=1,但是一开始多加了一个等号。

2. 本题需要数学基础好,两个重点:

(1)会打印某个范围内的素数表

(2)知道质因子的存在规律以及怎么表示

存在规律也就是:一个大于1的整数的质因子,要么全部小于等于根号n(因此找素数的范围是根号n而不是n),要么有一个大于根号n的例外,而这个例外在n不断除以它的质因子到最后,就是n本身了。

3. 对于质因子结构体数组的大小,由质因子的个数决定,是动态增加的,但是考虑到n在int范围内,而最小的10个质数的乘积2x3x5x7x11x13x17x19x23x29已经超过了int,所以数组大小不会超过10。

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>

using namespace std;
typedef long long LL;

const int maxn = 10007;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;

struct factor{
	int fac,cnt;//质因数数值,个数(不必在此处初始化为0) 
}facs[10];

int main(){

	int n;
	scanf("%d",&n);
	int n0 = n;//为了之后的打印 
	
	if(n==1){//特判 
		printf("1=1");
		return 0;
	}
	int L = (int)sqrt(1.0*n);
	bool isPrime[L] = {0};//0代表是素数 
	isPrime[2] = 0;
	int primes[L];//存放素数
	int pnum = 0;//素数个数 
	//打印2-L的素数表
	for(int i=2;i<=L;i++){
		if(!isPrime[i]){
			primes[pnum++] = i;
			for(int j=i+i;j<=L;j+=i){//筛除 
				isPrime[j] = 1;
			}
		}
	}
	
	int facnum = 0;//结构体数组facs的元素个数 
	for(int i=0;i<pnum&&primes[i]<=L;i++){
		if(n%primes[i]==0){
			facs[facnum].fac = primes[i];
			facs[facnum].cnt = 0;
			
			while(n!=1&&n%primes[i]==0){
				n /= primes[i];
				facs[facnum].cnt ++;
			}
			facnum ++;//容易忘记
		}	
	}
	
	if(n!=1){//说明存在唯一一个质印数在(sqrt(n)-n]范围内
		facs[facnum].fac = n;
		facs[facnum].cnt = 1;
		facnum ++;
	}
	
	//输出
	printf("%d=",n0);
	for(int i=0;i<facnum;i++){
		if(facs[i].cnt==1)printf("%d",facs[i].fac);
		else{
			printf("%d^%d",facs[i].fac,facs[i].cnt);
		}
		if(i!=facnum-1)printf("*");
	} 
	 
	return 0;
}

以上是关于1059 Prime Factors的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1059. Prime Factors

1059 Prime Factors(25 分)

PTA(Advanced Level)1059.Prime Factors

1059 Prime Factors

1059 Prime Factors

patA1059 Prime Factors