传送门:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1775
题意:将一个数用素数个数的乘积表示出来。
比如5!= 120 = (3 1 1 0 0......)
这个是素数数组 (2 3 5 7 11.....)
思路:预处理素数,之后从小到大每个素数的枚举,能整除就不断统计。
代码:
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
bool fab[110];
int n, map[110], key;
memset(fab, 0, sizeof(fab));
for (int i = 2; i <= 10; ++i)
{
if (fab[i] == false)
for (int j = 2; i * j <= 100; ++j)
fab[i * j] = true;
}
while (scanf("%d", &n) && n)
{
memset(map, 0, sizeof(map));
for (int i = 2; i <= n; ++i)
for (int j = 2; j <= n; ++j)
{
key = i;
while (fab[j] == false && key % j == 0)
{
key /= j;
++map[j];
}
}
printf("%3d! =", n);
int j = 0;
for (int i = 2; i <= n; ++i)
{
if (fab[i] == false)
{
++j;
if (j % 16 == 0)
printf("\n ");
printf("%3d", map[i]);
}
}
printf("\n");
}
return 0;
}