题目:
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *…*pm^km.
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 = p1^k1 * p2^k2 *…*pm^km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT be printed out.
Sample Input:97532468Sample Output:
97532468=2^2*11*17*101*1291思路:
1.先构建质数表,根据N的大小,把1~sqrt(N)之间的质数找出来;
2.根据质数表,从小到大把N的因子找出,这里利用map比较好做;
3.注意N=1的情况
代码:
#include<iostream>
#include<cstring>
#include<map>
#include<math.h>
using namespace std;
int main()
{
//ifstream cin;
//cin.open("case1.txt");
long N;
cin >> N;
if (N == 1)
printf("1=1\n");
else
{
//构建质数表
bool *prime = (bool *)malloc(sizeof(bool) * sqrt(N));
memset(prime, 0, sizeof(bool)*sqrt(N));
int j, i = 2;
for (; i <= sqrt(N); ++i)
{
if (!prime[i])
{
for (j = 2 * i; j <= sqrt(N); j += i)
{
prime[j] = 1;
}
}
}
//根据质数表进行分解N
long NN = N;
map<int, int> p;
for (i = 2; i <= N;)
{
if ((!prime[i]) && (N%i == 0))
{
//遇到质数,且该质数是N的因数
p[i]++;
N /= i;
}
else
{
//跳过
++i;
}
}
//output
map<int, int>::iterator iter = p.begin();
printf("%ld=", NN);
while (1)
{
printf("%d", iter->first);
if (iter->second > 1)
{
printf("^%d", iter->second);
}
iter++;
if (iter != p.end())
{
printf("*");
}
else
{
break;
}
}
printf("\n");
}
system("pause");
return 0;
}