标签:des style io os 使用 sp java for on
3
1 100
2 2
3 19
Case #1: 14
Case #2: 1
Case #3: 4
解题思路
如果用暴力求解,果断超时。这道题需要先打标。第一次打标是找到范围内的素数,第二次打表是找到范围内的美素数,第三次打表是找到各数之前的美素数的数量。
最后判断范围内的美素数的数量的时候,使用num[m]-num[n-1],减去的是num[n]之前的美素数数量,而把num[n]留下来
代码
#include<stdio.h> #include<string.h> int a[1100000],b[1100000],num[1100000];//数定义为全局变量 int main() { int t; int m,n; int i,j,k,l=1; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(num,0,sizeof(num)); a[0]=a[1]=1; for(i=0;i<1005000;i++) { if(a[i]) continue; for(j=i+i;j<1005000;j+=i) a[j]=1; }//判断其本身是不是素数 for(i=0;i<1005000;i++) { if(a[i]==0) { j=i; k=0; while(j) { k+=j%10; j/=10; } if(a[k]==0) b[i]=1; } } //判断是不是美素数 for(i=1;i<=1000000;i++) if(b[i]==1&&a[i]==0) num[i]=num[i-1]+1; else num[i]=num[i-1];//再次打表,num数组中存储脚码之前的美素数有多少个 scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); printf("Case #%d: ",l); l++; printf("%d\n",num[m]-num[n-1]);//注意是-num[n-1] } return 0; }
标签:des style io os 使用 sp java for on
原文地址:http://blog.csdn.net/wangluoershixiong/article/details/41725991