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的主要内容,如果未能解决你的问题,请参考以下文章