UVa 160 Factors ans Factorials(数论)

自从换了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;
}



你可能感兴趣的:(UVa 160 Factors ans Factorials(数论))