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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值