UVA - 10856 Recover Factorial(二分查找)
2016-08-21 19:40
375 查看
题目:(Sample Output是错的!要不是因为题目里面有描述输出,估计没人做的对吧
)
这个题目,和这个OJ里面的另外一个题目有着紧密的联系。点击打开我的博客
(这一点,其实从标题也看的出来)
把这个题目的代码改改就能得到这个题目的代码。
在编代码的过程中就已经用到了二分了,可以确定,需要的数组大小的大致范围,大于2700000,小与2750000
代码:
在查找的时候,还是二分,因为数组已经是升序的了。
不过,有个特殊情况,sum[0]=sum[1]=0,这是唯一的不是严格递增的地方,需要特判。
)
这个题目,和这个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 - 10487 - Closest Sums(二分查找)
- uva 1152 二分查找+中途相遇法
- UVA-846 Steps 二分查找
- UVA 10763 - Foreign Exchange(二分查找)
- UVA 10341 Solve It 解方程 二分查找+精度
- UVA - 1152 4 Values whose Sum is 0问题分解,二分查找
- uva10341 - solve it (二分查找)
- UVA 12663 (线段树区间更新+二分查找,Q次区间更新后,求满足结果大于K的个数)
- 【二分查找+优化O(n)】【续UVA1121】Subsequence
- 二分查找——UVa 10706 - Number Sequence
- UVALive3635 UVA12097 POJ3122 HDU1969 Pie【二分查找】
- [二分查找]Babelfish uva 10282
- uva 10341 - Solve It(二分查找水题)
- 【二分查找+优化O(n)】【续UVA1121】Subsequence
- UVALive - 3635 Pie(二分答案查找)
- UVA 10487 Closest Sums (二分查找)
- uva:10487 - Closest Sums(二分查找)
- UVA 10341 Solve It (解方程 二分查找+精度)
- UVA - 10487 Closest Sums(二分查找)
- uva10341 - solve it (二分查找)