阅读理解
时间限制:
4000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
阅读以下代码:
#include<stdio.h>
bool _(int __)
{
int ___=1;
for(___++; ___<__; ___++)
if(!(__%___))
return false;
return true;
}
int main()
{
int a,b,cnt=0;
while(~scanf("%d%d",&a,&b))
{
printf("Case %%%d:",++cnt);
int count=0;
for(int i=a; i<=b; i++)
if(_(i))
count++;
printf("%d\n",count);
}
}PS: _ 为合法标识符。
-
输入
- 输入两个数(0 < a <= b < 100000 ) 输出
- 格式及细节见代码及输出样例 样例输入
-
2 3 3 5
样例输出
-
Case %1:2 Case %2:2
来源
- 流年 上传者
这道题一直被超时困扰着,1、常规的求素数方法会导致超时,2、把求素数改成筛法后,再判断,还是会超时。
方法:筛法加打表,先都预处理出来,坚决不重复计算任何一个部分,哪怕是小小的判断,大数据会直接导致超时,shit
/** * Project Name: nyoj_2.0 * File Name: 1167.cpp * Created on: 2015年5月16日 下午3:14:26 * Author: jtahstu * QQ: 1373758426 E-mail:1373758426@qq.com * Copyright (c) 2015, jtahstu , All Rights Reserved. */ /** * Project Name: C++ * File Name: nyoj1167.cpp * Created on: 2015年4月7日 下午9:14:33 * Author: jtahstu * Copyright (c) 2015, jtahstu , All Rights Reserved. */ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<string> #include<cstring> using namespace std; int a[100005], ans[100005]; int main() { memset(a, 0, sizeof(a)); memset(ans, 0, sizeof(ans)); int c, b, count = 0, sum = 0; for (int i = 2; i < 100001; i++) { //筛法确实是可以大大缩短时间,但还是超时 if (a[i] == 0) for (int j = i + i; j < 100001; j += i) a[j] = 1; } for (int i = 0; i <= 100000; i++) { //筛法后还要打表以节约时间 if (!a[i]) { sum++; } ans[i] = sum; } while (scanf("%d%d", &c, &b) != EOF) { count++; printf("Case %%"); printf("%d:%d\n", count, ans[b] - ans[c - 1]); //减去a的前一个数 } return 0; }