求n!的质因子个数。也就是2~n每个数的质因子的个数之和。
输出的格式比较麻烦,需要注意。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int vis[110], prime[100], count = 0;
int ans[100];
void prime_table() //获取质数表
{
int i, j;
memset(vis, 0, sizeof(vis));
for(i = 2; i < 102; i++)
{
if(!vis[i])
{
prime[count++] = i;
for(j = 2 * i; j < 102; j += i)
vis[j] = 1;
}
}
}
int main()
{
prime_table();
int n;
while(cin >> n)
{
if(!n)
break;
memset(ans, 0, sizeof(ans));
for(int i = 2; i <= n; i++) //对于每个i,求它的质因子个数
{
int m = i, now = 0;
while(m > 1)
{
while(m % prime[now] == 0)
{
ans[now]++; //质因子加1
m /= prime[now];
}
now++;
}
}
printf("%3d! =", n);
for(int j = 0; prime[j] <= n; j++)
{
printf("%3d", ans[j]);
if((j + 1) % 15 == 0)//每行输出15个,
{
printf("\n");
if(prime[j + 1] <= n)//如果后面还有数,则需要输出相应的空行,
printf(" ");
}
}
if(prime[14] > n || prime[15] <= n)//判断是否需要换行,
printf("\n");
}
return 0;
}