pat a1059 Prime Factors (25分) 【质因子分解】

题目:

https://www.nowcoder.com/pat/5/problem/4112

https://pintia.cn/problem-sets/994805342720868352/problems/994805415005503488

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p​1​​​k​1​​​​×p​2​​​k​2​​​​×⋯×p​m​​​k​m​​​​.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range of long int.

Output Specification:

Factor N in the format N = p​1​​^k​1​​*p​2​​^k​2​​**p​m​​^k​m​​, where p​i​​'s are prime factors of N in increasing order, and the exponent k​i​​ is the number of p​i​​ -- hence when there is only one p​i​​, k​i​​ is 1 and must NOT be printed out.

Sample Input:

97532468

Sample Output:

97532468=2^2*11*17*101*1291
#include<bits/stdc++.h>
using namespace std;

struct factor
{
	int x;
	int cnt;
} fac[10];//10个质数相乘已经超出了int表示的范围

int main()
{
	int n;
	cin>>n;
	int m=n;  //用m存一下!!以便输出。 
	
	//n=1,特判。 
	if(n==1)
	{
		cout<<"1=1";
		return 0;  //别忘记及时return,终止程序!! 
	} 
	
	int num=0; //记录n的质因子的个数 
	
	//1、求出质因子: 	
	int sqr=(int)sqrt(1.0*n);
	for(int i=2;i<=sqr;i++)
	{
		if(n%i==0)
		{
			fac[num].x=i;
			fac[num].cnt=0;
			while(n%i==0)
			{
				fac[num].cnt++; 
				n/=i;
			}
			num++;
		}
		if(n==1) break;
	}
	if(n!=1)  //存在大于sqrt(n)的质因子
	{
		fac[num].x=n;
		fac[num].cnt=1;
		num++;
	}
	
	//2、输出:
	cout<<m<<'=';
	for(int i=0;i<num;i++)
	{
		//未输出到最后一个质因子 
		if(i<num-1)
		{
			if(fac[i].cnt==1)
			{
				cout<<fac[i].x<<'*';
			}
			else
			{
				cout<<fac[i].x<<'^'<<fac[i].cnt<<'*';
			}
		}
		//处理最后一个 
		else
		{
			if(fac[i].cnt==1)
			{
				cout<<fac[i].x;
			}
			else
			{
				cout<<fac[i].x<<'^'<<fac[i].cnt;
			}
		}		
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath> 
using namespace std;

const int maxn=100010;

bool is_prime(int n)
{
	if(n==1) return false;
	else 
	{
		int sqr=(int)sqrt(1.0*n);
		for(int i=2;i<=sqr;i++)
		{
			if(n%i==0) return false;
		}
		return true;
	}
} 

int prime[maxn];
int pnum=0;

/*
因为大部分数字的因子分解,都是可以通过某几个质数的重现得到,即一个质数可能在因子分解式中出现多次;
所以,无需一直求到n的质数,前几次测试出现的段错误,都是因为开的质数表放不下了。
*/ 
/*
//错误代码: 
void find_prime(int n)
{
	for(int i=2;i<n;i++)
	{
		if(is_prime(i)==true) prime[pnum++]=i;
	}	
}
*/

void find_prime()
{
	for(int i=2;i<maxn;i++)
	{
		if(is_prime(i)==true) prime[pnum++]=i;
	}	
}

struct factor
{
	int x;
	int cnt;
}fac[10];


int main()
{	
	find_prime();
	int n;
	int num=0;  //不同质因子的个数 
	cin>>n;
	
	//find_prime(n);
	
	if(n==1) cout<<"1=1";
	else
	{
		cout<<n<<"=";
		int sqr=(int)sqrt(1.0*n);
		for(int i=0;i<=pnum&&prime[i]<=sqr;i++)
		{
			if(n%prime[i]==0)
			{
				fac[num].x=prime[i];
				fac[num].cnt=0;
				while(n%prime[i]==0)
				{
					fac[num].cnt++;
					n/=prime[i];
				}
				num++;
			}
			if(n==1) break;
		}		
		if(n!=1) 
		{
			fac[num].x=n;
			fac[num].cnt=1;
			num++;
		}
		
		//按格式输出
		for(int i=0;i<num;i++)
		{
			//if(i>0) cout<<'*';
			cout<<fac[i].x;
			if(fac[i].cnt>1) cout<<'^'<<fac[i].cnt;
			if(i>=0&&i<num-1) cout<<'*';			
		} 
		
	} 
		
	return 0;
}
发布了146 篇原创文章 · 获赞 60 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/OpenStack_/article/details/103897331