码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 884 Factorial Factors

时间:2016-08-21 18:38:43      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

题目:

技术分享


这个题目,我先开始尝试直接求出每个素因子的次数,然后全部加起来。

代码:

#include<iostream>
using namespace std;

int degree_in_fact(int m, int p)
{
	if (m)return degree_in_fact(m / p, p) + m / p;
	return 0;
}

bool isprime(int n)
{
	if (n == 2)return true;
	if (n % 2 == 0)return false;
	for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false;
	return true;
}
int main()
{
	int n;
	while (cin >> n)
	{
		int sum = 0;
		for (int i = 2; i <= n; i++)if (isprime(i))sum += degree_in_fact(n, i);
		cout << sum << endl;
	}
	return 0;
}

但是超时了,想必是因为测试用例比较多。

所以只好改成打表的方法。

代码:

#include<iostream>
using namespace std;

int sum[1000001];

bool isprime(int n)
{
	if (n == 2)return true;
	if (n % 2 == 0)return false;
	for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false;
	return true;
}

int main()
{
	for (int i = 0; i < 1000001; i++)sum[i] = 0;
	for (int i = 2; i < 1000001; i++)
	{
		if (isprime(i))
		{
			long long m = i;
			while (m < 1000001)
			{
				for (int j = m; j < 1000001; j += m)sum[j]++;
				m *= i;
			}
		}
	}
	for (int i = 1; i < 1000001; i++)sum[i] += sum[i - 1];
	int n;
	while (cin >> n)cout << sum[n] << endl;
	return 0;
}

这个打表的方法类似于筛法(其实本质上确实是一样的)

UVA - 884 Factorial Factors

标签:

原文地址:http://blog.csdn.net/nameofcsdn/article/details/52268108

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!