题目pta,质因数,即素数的因子,有多少个,此题要求输出形式带幂次数,因此用结构体保存,注意求质因数,对于根号n来说,(n为所求的数),其实大于根号n的数理论只会有一个,所以大胆求前面的数即可,最后对这个剩余的商进行处理,直接保存即可,幂次肯定为1。P为保存的素数,不断遍历,进行求余,记得用while进行保持幂次数,NUM_yinzi为所求结果的集合的下标!
#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
bool test[105000];
int N = 105000;
int num;
int P[105000];
//有点像dp一次全部找到!
void isPrime() {
int i = 2;
for(; i <= N; i++) {
if(test[i]==false) {
P[num++] = i;
for(int j = i + i; j <= N; j+=i) {
test[j] = true;
}
}
}
}
struct T {
int x;
int count;
} R[10];
int main() {
int M,n;
scanf("%d",&M);
if(M==1){
printf("1=1");
return 0;
}
int temp = M;
memset(test,0,sizeof(test));
memset(P,0,sizeof(P));
num = 0;
isPrime();
//枚举根号M前面的素数,进行判断
//如果%为0;
//如果最后M不为1 那么证明有个数的平方是大于M的
//大于根号的只有一个!!!!记住结论
//所以此时要注意!
//i 代表第一个素数
int NUM_yinzi = 0;
int k = (int)sqrt(1.0 * M);
//往前 最好不要把k直接赋值进去,M会一直变动!虽然没错但是有点危险
for(int i =0; P[i] <= k; i++) {
if(M % P[i] == 0) {
//是因子
R[NUM_yinzi].x = P[i];
R[NUM_yinzi].count = 0;
while(M % P[i] == 0) {
R[NUM_yinzi].count++;
M /= P[i];
}
NUM_yinzi++;
}
//恰好的情况
if( M == 1) break;
}
if(M != 1){ // 左边一个 根号M 右边一个
R[NUM_yinzi].x = M;
R[NUM_yinzi].count = 1;
NUM_yinzi++;
}
printf("%d=",temp);
for(int i =0;i < NUM_yinzi;i++){
if(i > 0) printf("*");
printf("%d",R[i].x);
if(R[i].count>1)
printf("^%d",R[i].count);
}
return 0;
}