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

UVA - 10856 Recover Factorial(二分查找)

时间:2016-08-21 19:59:18      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

题目:(Sample Output是错的!要不是因为题目里面有描述输出,估计没人做的对吧技术分享

技术分享

这个题目,和这个OJ里面的另外一个题目有着紧密的联系。点击打开我的博客

(这一点,其实从标题也看的出来)

把这个题目的代码改改就能得到这个题目的代码。

在编代码的过程中就已经用到了二分了,可以确定,需要的数组大小的大致范围,大于2700000,小与2750000

代码:

#include<iostream>
using namespace std;

int sum[2750000];

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 < 2750000; i++)sum[i] = 0;
	for (int i = 2; i < 2750000; i++)
	{
		if (isprime(i))
		{
			long long m = i;
			while (m < 2750000)
			{
				for (int j = m; j < 2750000; j += m)sum[j]++;
				m *= i;
			}
		}
	}
	for (int i = 1; i < 2750000; i++)sum[i] += sum[i - 1];
	int n, low, high, mid;
	int cas = 1;
	while (cin >> n)
	{
		if (n < 0)break;
		cout << "Case " << cas++ << ": ";
		low = 0, high = 2749999;
		while (low < high - 1)
		{
			mid = (low + high) / 2;
			if (sum[mid] < n)low = mid;
			else if (sum[mid]>n)high = mid;
			else break;
		}
		if (n == 0)mid = 0;
		if (sum[mid] == n)cout << mid << "!\n";
		else cout << "Not possible.\n";
	}
	return 0;
}

在查找的时候,还是二分,因为数组已经是升序的了。

不过,有个特殊情况,sum[0]=sum[1]=0,这是唯一的不是严格递增的地方,需要特判。

UVA - 10856 Recover Factorial(二分查找)

标签:

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

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