1059 Prime Factors (25 分)
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pmkm.
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 = p1k1*p2k2*…*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:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
Code:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef long long LL;
struct Factor
{
int x, exp = 0;
Factor(int xx, int e) :x(xx), exp(e) {}
Factor() {};
};
vector<int> getPrimeTable(int maxn)
{
vector<int> prime(1, 0);
vector<bool> p(maxn, false);
for (int i = 2; i < maxn; i++)
{
if (!p[i])
{
prime.push_back(i);
for (int j = i * 2; j < maxn / 2; j += i)
p[j] = true;
}
}
return prime;
}
int main()
{
LL n;
cin >> n;
if (n == 1)
{
cout << "1=1" << endl;
return 0;
}
cout << n << "=";
vector<Factor> factors;
vector<int> prime = getPrimeTable(10001);
LL sqr = sqrt(n * 1.0);
for (int i = 1; i < prime.size() && prime[i] <= sqr; i++)
{
if (n % prime[i] == 0)
{
Factor f(prime[i], 0);
while (n % prime[i] == 0)
{
n /= prime[i];
f.exp++;
}
factors.push_back(f);
if (n == 1) break;
}
}
if (n != 1)
factors.push_back(Factor(n, 1));
for (int i = 0; i < factors.size(); i++)
{
cout << factors[i].x;
if (factors[i].exp > 1)
cout << '^' << factors[i].exp;
cout << (i == factors.size() - 1 ? '\n' : '*');
}
return 0;
}