Description | ||
给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数。 输入 第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。 输出 每行输出一个样例的结果。 |
旧代码如下:
#include<stdio.h>
#include<math.h>
int isPrime(int num);
int main()
{
int K;
scanf("%d", &K);
while (K--) {
int a, b, count=0,t,i;
scanf("%d %d", &a, &b);
if (a > b) {
t = a;
a = b;
b = t;
}
for (i = a; i <= b; i++) {
if (isPrime(i))count++;
}
printf("%d\n", count);
}
return 0;
}
int isPrime(int num)
{
int i;
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
遇到困难:
1、算法选择不对导致超时
2、Prime数组放int main里面放不了
3、Prime不是1000000而是1000001
代码如下:
#include<stdio.h>
int Prime[1000001];
int main()
{
int i, K, j;
for (i = 2; i <= 1000000; i++) {
Prime[i] = 1;
}
for (i = 2; i <= 1000000; i++) {
if (Prime[i]) {
for (j=2; j*i <= 1000000; j++) {
Prime[j*i] = 0;
}
}
}
scanf_s("%d", &K);
while (K--) {
int count1 = 0, count2 = 0, a, b, t;
scanf_s("%d %d", &a, &b);
if (a > b) {
t = a;
a = b;
b = t;
}
for (i = 0; i <= b; i++) {
if (Prime[i])
count2++;
}
for (i = 0; i <= a; i++) {
if (Prime[i])
count1++;
}
if (Prime[i-1])
printf("%d\n", count2 - count1 + 1);
else printf("%d\n", count2 - count1);
}
return 0;
}