[code] PTA 胡凡算法笔记 DAY050
Posted wait_for_that_day5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[code] PTA 胡凡算法笔记 DAY050相关的知识,希望对你有一定的参考价值。
文章目录
题目 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;
小结
需要遍历素数时,可以构建素数表以减轻时间复杂度。
以上是关于[code] PTA 胡凡算法笔记 DAY050的主要内容,如果未能解决你的问题,请参考以下文章