PTA 素因子分解

7-11 素因子分解(20 分)

给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1p2k2pmkm

输入格式:

输入long int范围内的正整数 N。

输出格式:

按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数kipi的个数;当ki为1即因子pi只有一个时不输出ki

输入样例:

1323

输出样例:

1323=3^3*7^2


#include<iostream>
#include<string>
#include<cmath>
#include<vector>
using namespace std;
int main() 
{
	vector<int>P;
	int A[10000] = { 0 };
	for (int i = 2; i < 100; i++)
	{
		if (A[i] == 0)
		{
			for (int j = i * i; j < 10000; j += i)
				A[j] = 1;
		}
	}
	long n;
	cin >> n;
	cout << n << "=";
	while (1)
	{
		long t = n;
		for (int k = 2; k <= sqrt(n); k++)
		{
			if (A[k] == 0 && n%k == 0)
			{
				P.push_back(k);
				n = n / k;
				break;
			}
		}

		if (n == t)
		{
			P.push_back(n);
			break;
		}
	}

	int sum = 1;
	for (int q = 0; q < P.size()-1; q++)
	{
		if (P[q] == P[q + 1])
			sum++;
		else
		{
			if (sum == 1)
				cout << P[q] << "*";
			else
			{
				cout << P[q] << "^" << sum << "*";
				sum = 1;
			}
		}
	}
	if (sum == 1)
		cout << P[P.size() - 1] ;
	else
		cout << P[P.size() - 1] << "^" << sum;
	return 0;
}

算法分析:
(1)先用素数筛找到前10000项的素数当除数用
(2)用一个无限循环寻找素因子,当n本身不发生变化时退出循环,即n为1或者没有素因子
(3)将之前得到的素因子存入一个数组中,遇到前后不同的输出,否则sum++,sum为系数的指数,1的时候不用输出

猜你喜欢

转载自blog.csdn.net/tobealistenner/article/details/79896640