自从换了linux,就没写过题解。今天开始要继续写。
首先,求一个数的阶层里面每个素数因子的个数,那么我们就可以求从2开始到这个数的每个数的素数因子的个数,相应加和。比如是10!= 1*2*3*4*5*6*7*8*9*10, 那么 这里面2的个数就是2,4, 6, 8, 10里面2的因子数的加和1+2+1+3+1=8。依次类推
接下来就是求每个数的素因子及其个数,模板即可。不是很难的题目
其次要注意的输出格式,这里我犯了一个错误,没有仔细考虑如果输出的数的个数恰好是15的倍数,那么最后一行就不应是再输出换行了;还有在输出换行的时候要注意的当k是15的倍数的时候,只输出一个换行,因为k不是每次循环值都改变的,所以如果写在if的外面,就会有很多换行输出,不可取!因此,这个输出的处理应该是每当有要输出的数的时候,判断一下是第几个,如果k对15取余为1,说明可以换行了,然后再输出这个数,就避免了刚刚是15的倍数的情况!
核心代码如下:
int anss[101];
int main()
{
prime_sieve();
int n;
while ( scanf("%d",&n) != EOF && n ) {
for ( int i = 2; i <= 100; ++i ) if (!is_prime(i) ) anss[i] = -1; else anss[i] = 0;
for ( int i = 2; i <= n; ++i ) {
IIV ans;
prime_factorize(i, ans);
int len = ans.size();
for ( int i = 0; i < len; ++i ) anss[ans[i].first]+=ans[i].second;
}
printf("%3d! =", n);
for ( int i = 2, k = 0; i <= n; ++i ) {
if ( anss[i] != -1 ) {
k++;
if ( k > 1 && k % 15 == 1 ) printf("\n ");
printf("%3d", anss[i]);
}
}
printf("\n");
}
return 0;
}