题目 A1059 Prime Factors
-
题意
输入n
,输出其所有素因子,通过n= p1 ^ k1 * p2 ^ k2 * ....
形式。其中pn
为质因子,kn
为该质因子出现次数,只有kn>1
时才输出。 -
思路
核心点:构造素数表减轻时间复杂度;边计算边输出无需存储结果。需要考虑一下异常,n = 1
的情况以及当质因子大于我们设置的素数表中最大的值的情况。然后就是注意输出格式问题就好了。
test case
1 // 1 = 1
7 // 7 = 7
8 // 8 = 2^3
2147483647 // 2147483647 = 2147483647
2147483646 // 2147483646 = 23^271131151331
- Code in C++
#include <cstdio>
#include <cmath>
const int maxn = 100010;
bool isPrime(long long num)
{
if (num <= 1) return false;
for(int i = 2; i <= std::sqrt(num); ++i)
{
if (num % i == 0) return false;
}
return true;
}
// 构造素数表
int prime[maxn] = {0}, pNum = 0;
void buildTable()
{
for (int i = 1; i < maxn; ++i)
{
if (isPrime(i)) prime[pNum++] = i;
}
}
int main()
{
buildTable();
long long n;
scanf("%lld", &n);
printf("%lld=", n);
if (n == 1) printf("1");
else
{
bool first = true;
int sqr = std::sqrt(n);
for (int i = 0; i < pNum && prime[i] <= sqr; ++i)
{
int times = 0;
if (n % prime[i] == 0)
{
while (n != 1 && n % prime[i] == 0)
{
++times;
n /= prime[i];
}
if (times > 0)
{
if (!first) printf("*");
printf("%d", prime[i]);
first = false;
if (times > 1) printf("^%d", times);
}
}
if (n == 1) break;
}
// 如果是大于根号的因子
if (n != 1)
{
if (!first) printf("*");
printf("%lld", n);
}
}
return 0;
}
小结
需要遍历素数时,可以构建素数表以减轻时间复杂度。