A1059 Prime Factors (25分) 质数因子的统计个数.cpp

题目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;
}

发布了78 篇原创文章 · 获赞 3 · 访问量 6572

猜你喜欢

转载自blog.csdn.net/weixin_38023259/article/details/105028087