A1059 Prime Factors

1.这种题目写起来还是有一点麻烦的,因为特殊数据很多
2.建议先用一个p数组存素数,筛法会比较快,也就是下面代码的find函数
3.1=1要特别判断,然后就是*的输出情况,避免出现5=*5的情况
4.maxn要开的够大

#include <stdio.h>
#include <math.h>

const int maxn = 100010;
int p[maxn],len = 0;	//素数数组
bool table[maxn] = {false};//false表示是素数
void Find()			//筛法找素数
{
	for(int i=2;i<maxn;i++){
		if(table[i]==false){
			p[len++] = i;
			for(int j=i+i;j<maxn;j += i)table[j] = true;
		}
	}
}
bool isPrime(long long n)//判断是否为素数,输出的时候用
{
	if(n<=1)return false;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0)return false;
	}
	return true;
}
int main(int argc, char const *argv[])
{
	long long n;
	scanf("%lld",&n);
	Find();			//这句不要忘了写
	//for(int i=0;i<len;i++)printf("%d ",p[i]);
	printf("%lld=",n);
	if(n==1)printf("1");	//1=1特别判断
	else{	
		int flag = 0;			//用来控制*的输出
		for(int i=0;i<len;i++){	//遍历素数数组
			int exp = 0;		//指数计数
			while(n%p[i]==0){
				n /= p[i];
				exp++;
			}
			if(exp){			//只要指数不为0
				if(flag)printf("*");
				printf("%d",p[i]);
				flag = 1;
			}
			if(exp>=2)printf("^%d",exp);//指数大于1才输出指数
			if(isPrime(n)){
				if(flag)printf("*");
				printf("%d",n);
				break;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43108373/article/details/84205275