在实训的时候这道题有一个小技巧:先在本地算出1w以内的质数,然后直接无脑查询即可。
计算质数的程序:
#include <stdio.h>
#include <math.h>
int isPrime(int n)
{
int i, max=sqrt(n);
if(n%2==0)
return 0;
for(i=3; i<=max; i+=2)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int i, cnt=0;
for(i=3; i<10001; i++) if(isPrime(i)) {printf("%d,",i); cnt++;}//输出质数加逗号(除2以外)
printf("\n%d",cnt);//输出质数个数
return 0;
}
提交的程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct{int s, e, cnt;}Number;
int cmp(const void*a, const void*b)
{
Number *p1=(Number*)a, *p2=(Number*)b;
if(p1->cnt==p2->cnt)
{
if(p1->s==p2->s) return p1->e-p2->e;
return p1->s-p2->s;
}
return p1->cnt-p2->cnt;
}
int main(void)
{
int T, I;
scanf("%d",&T);
for(I=0; I<T; I++)
{
int n, i, j, k, prime[1229]={/*这里是质数表*/};
Number num[10000];
scanf("%d",&n);
for(i=0; i<n; i++) scanf("%d %d",&num[i].s,&num[i].e);
for(i=0; i<n; i++)
{
num[i].cnt=0;
int start=num[i].s, end=num[i].e;
for(k=0; k<1229; k++) if(prime[k]>=start) break;
for(j=start; j<=end; j++)
if(j==prime[k]) {k++; num[i].cnt++;}
}
qsort(num, n, sizeof(num[0]), cmp);
printf("case #%d:\n",I);
for(i=0; i<n; i++) printf("%d %d %d\n",num[i].s,num[i].e,num[i].cnt);
}
return 0;
}
缺点就是太暴力了……
绝杀
666