PAT甲级 1059 Prime Factors (25 分)

\quad 首先建立一个素数表,这个素数表包含了[0, 100000]的数是否是素数的判定。接下来我们将n进行分解,方法如下:依次将n除以1到100000的素数i,若n能整除i,则i是一个质数因子,并且统计i出现次数。这里我用res[100000]这个数组进行统计,若出现了i这个质数因子,则res[i]++。这样,通过遍历res数组我们就能获得所有的质因子及其出现次数(指数)。核心程序如下:

while(n>1)
{
	for (int i = 2; i < maxn; ++i)
	{
		if(prime[i]==1 && n%i==0)
		{
			res[i]++;
			n /= i;
		}
	}
}

\quad 完整程序如下:

#include 
using namespace std;

const int maxn = 1e+5+10;
int prime[maxn];
void setPrime()
{
	fill(prime, prime+maxn, 1); // 初始化为1,表示都是素数
	for (int i = 2; i < maxn; ++i)
	{
		for (int j = 2; j*i < maxn; ++j)
		{
			prime[i*j] = 0; // 这些元素不是素数,置为0
		}
	}
}

int res[maxn];
int main(int argc, char const *argv[])
{
	setPrime();
	long long n;
	cin >> n;
	if(n==1)
	{
		cout << "1=1";
		return 0;
	}
	long long t = n;
	while(n>1)
	{
		for (int i = 2; i < maxn; ++i)
		{
			if(prime[i]==1 && n%i==0)
			{
				res[i]++;
				n /= i;
			}
		}
	}
	cout << t << "=";
	vector > temp;
	for (int i = 0; i < maxn; ++i)
	{
		if(res[i]>0)
		{
			temp.push_back(make_pair(i, res[i]));
		}
	}
	cout << temp[0].first;
	if(temp[0].second>1) cout << "^" << temp[0].second;
	for (int i = 1; i < temp.size(); ++i)
	{
		cout << "*" << temp[i].first;
		if(temp[i].second>1) cout << "^" << temp[i].second;
	}
	return 0;
}

你可能感兴趣的:(PAT甲级)