- #include
- using namespace std;
-
- const int MAXN = 1000006;
- int primes[MAXN], cnt;
- bool st[MAXN];
-
- void get_primes(int n) {
- for (int i = 2; i <= n; i++) {
- if (!st[i]) primes[cnt++] = i;
- for (int j = 0; primes[j] * i <= n; j++) {
- st[primes[j] * i] = true;
- if (i % primes[j] == 0) break;
- }
- }
- }
-
- int main() {
- int n;
- cin >> n;
- get_primes(n);
- int c[MAXN] = {0};
- // 优化:只计算每个质数在 n! 中的出现次数
- for (int i = 0; i < cnt; i++) {
- int p = primes[i];
- int num = 0;
- for (int j = p; j <= n; j += p) {
- int x = j;
- while (x % p == 0) {
- num++;
- x /= p;
- }
- }
- c[i] = num;
- }
- for (int i = 0; i < cnt; i++) {
- if (c[i]) cout << primes[i] << " " << c[i] << endl;
- }
- return 0;
- }
初始化和获取质数:
get_primes
函数使用了埃拉托斯特尼筛法(Sieve of Eratosthenes)来找出从2到n之间的所有质数,并存储在primes
数组中。st
数组用于标记哪些数已经被筛掉(即非质数),而cnt
用于跟踪已经找到的质数数量。计算质因数在n!中的幂次:
main
中,首先读入一个整数n
,然后调用get_primes
函数来获得所有不大于n
的质数。p
,程序计算出p
在n!
中作为因子出现了多少次。p
到n
的每个数,检查每个数能够被p
整除多少次来实现的。每次能够整除时,计数器num
增加,直到该数不再能被p
整除。输出结果:
n!
中出现的次数,并将它们输出。如果某个质数在n!
的质因数分解中出现,则输出该质数及其对应的次数。注意:代码中的注释“优化:只计算每个质数在 n! 中的出现次数”意味着,代码并没有直接计算n!,而是计算了n!的质因数分解,这比直接计算阶乘更有效率,因为阶乘的值会变得非常大,可能会超出计算机可以处理的范围。
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- const int N = 1000010;
-
- int primes[N], cnt;
- bool st[N];
-
- void init(int n)
- {
- for (int i = 2; i <= n; i ++ )
- {
- if (!st[i]) primes[cnt ++ ] = i;
- for (int j = 0; primes[j] * i <= n; j ++ )
- {
- st[i * primes[j]] = true;
- if (i % primes[j] == 0) break;
- }
- }
- }
-
- int main()
- {
- int n;
- cin >> n;
- init(n);
-
- for (int i = 0; i < cnt; i ++ )
- {
- int p = primes[i];
- int s = 0;
- for (int j = n; j; j /= p) s += j / p;
- printf("%d %d\n", p, s);
- }
-
- return 0;
- }
初始化质数列表:
init
函数使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来生成小于等于nn的所有质数,并存储在primes
数组中。st
数组用于标记哪些数已被筛去(即已知的合数)。primes
数组中,并且所有它的倍数都会被标记为合数。计算质因数在n!n!中的幂次:
main
函数中,首先读取一个整数n
,然后调用init
函数生成所有小于等于n
的质数。s
初始化为0,然后使用一个循环,每次将j
除以p
,并将商加到s
上,直到j
不足以再被p
整除。输出结果:对于每个质数pp和它在n!n!中出现的次数p
和s
,使用printf
函数输出这对质数和次数。
printf
和scanf
(虽然这里只用了cin
)通常比cout
和cin
快,尤其是在大量数据的输入输出时。