题目大意:输入一个正整数,要求输出该正整数的素数分解因素,并按照要求格式输出;
分析:首先用素数筛选法找出一定范围内的所有素数,然后按照从小到达的顺序,对该正整数进行素数分解;那么筛选素数的范围到底要多大呢?
该题中正整数N的范围是long int(-2147483648~2147483647), 素数只要筛选到100000即可,因为1000002>2147483647,如果分解后的部分不能被100000以内的素数整除,那么剩下的部分一定是一个素数,怎么证明呢?
如果剩下的部分是合数,那么一定还有一个100000以内的因素,这个和不能被100000以内的素数整除相矛盾;
#include<iostream>
int prime[100000];
int primeSize = 0;
bool mark[100000] = { 0 };//被标记为true即为非素数
void init(){ //素数筛选法
for (int i = 2; i < 100000; i++){
if (mark[i]) //如果已经标记过,则跳过
continue;
prime[primeSize++] = i;
if (i > 1000) continue;
for (int j = i * i; j < 100000; j += i)
mark[j] = true;
}
}
int main(){
init();
long int primeFac[1000];//按序存放素因数
int facSize = 0;//素因数的个数
int FacNum[1000] = { 0 };//素因数的幂
long int n, tmp;
scanf("%ld", &n);
tmp = n;
if (n == 1){
printf("1=1");
return 0;
}
for (int i = 0; i < primeSize; i++){
if (tmp%prime[i] == 0){
primeFac[facSize] = prime[i];
while (tmp%prime[i] == 0){
FacNum[facSize]++;
tmp /= prime[i];
}
facSize++;
}
if (tmp == 1)
break;
}
if (tmp != 1){
primeFac[facSize] = tmp;
FacNum[facSize++] = 1;
}
printf("%ld=", n);
for (int i = 0; i < facSize; i++){
if (i != 0)
printf("*");
printf("%ld", primeFac[i]);
if (FacNum[i] > 1)
printf("^%d", FacNum[i]);
}
return 0;
}