金山西山居初赛(2)第一题美素数--hdu4548
2013-05-19 09:04
218 查看
美素数满足两个条件:
1.该数本身是素数。
2.该数各位数字之和也是素数。
题目中的数据范围是1~1百万,如果使用暴力肯定tle。于是我就想到了打表,我把从1到1百万之间的所有美素数打出来。提交后发现,代码太长,没法提交^_^。所以就想到用一个数组在程序初始化的时候来记录满足条件的美素数。在1~1百万之间的美素数个数3万多些。再用二分法从3万个数据中找到下边界,然后循环出满足条件的个数输出。
1.该数本身是素数。
2.该数各位数字之和也是素数。
题目中的数据范围是1~1百万,如果使用暴力肯定tle。于是我就想到了打表,我把从1到1百万之间的所有美素数打出来。提交后发现,代码太长,没法提交^_^。所以就想到用一个数组在程序初始化的时候来记录满足条件的美素数。在1~1百万之间的美素数个数3万多些。再用二分法从3万个数据中找到下边界,然后循环出满足条件的个数输出。
#include<stdio.h> int data[40000];//存放1到1百万之间的美素数 //判断一个数是否是素数 int isPrime(int n){ int i; for(i=2;i*i<=n;i++){ if(n%i==0)return 0; } return 1; } //将1到1百万之间美素数放到data数组中 void init(){ int i,temp,sum; int num=0; for(i=2;i<1000000;i++){ temp=i; sum=0; while(temp>0){ sum=sum+temp%10; temp=temp/10; } //如果i的各位数之和是素数并且i也是素数。满足条件 if(isPrime(sum) && isPrime(i)){ data[num++]=i; } } } //二分查找,找到离a最近的那个下标. int bSearch(int value){ int left=0,right=30122; int index=(left+right)/2; while(left<=right){ if(data[index]==value)return index; else if(data[index]>value){ right=index-1; }else{ left=index+1; } index=(right+left)/2; } return index; } int main(){ int T,i,cnt=1,result; int a,b,pos; init(); scanf("%d",&T); while(T--){ result=0; scanf("%d%d",&a,&b); //将找到的下标值-2是为了确保下界的正确性。 pos=bSearch(a)-2; if(pos<0)pos=0; for(i=pos;;i++){ if(data[i]>=a && data[i]<=b)result++; if(data[i]>b)break; } printf("Case #%d:",cnt); cnt++; printf(" %d\n",result); } return 0; }
相关文章推荐
- 金山西山居2013程序挑战赛初赛 第一题
- 科赛平台--2017中国网络安全技术对抗赛(初赛第14名分享)-第一题
- 百度时间(2007年百度之星初赛第一题)
- 竞价-2013编程之美初赛第一场第一题
- 2013金山西山居创意游戏程序挑战赛——初赛(1)
- 区间数据hdu4548(美素数)
- 2013金山西山居创意游戏程序挑战赛——初赛(1) A 魔法串
- 2005年百度之星初赛题目第一题(连续正整数)
- HDU 4500 小Q系列故事——屌丝的逆袭 2013腾讯编程马拉松初赛第〇场第一题
- 金山西山居2013程序挑战赛初赛 第三题
- 2013金山西山居创意游戏程序挑战赛——初赛(2) A 美素数(hdu 4548)
- 2013金山西山居创意游戏程序挑战赛——初赛(2)M斐波那契数列
- hdu 4545 魔法串 2013金山西山居创意游戏程序挑战赛——初赛(1)
- HDU 4525 威威猫系列故事——吃鸡腿 2013腾讯编程马拉松初赛第五场第一题
- 金山西山居初赛第一场
- 2013金山西山居创意游戏程序挑战赛——初赛(2) B M斐波那契数 (hdu 4549 )
- 杨辉三角与组合数的关系(百度之星17年初赛B第一题)
- [原]图标排列-2011百度之星初赛第一题解答
- 2013金山西山居创意游戏程序挑战赛——初赛(1)
- 2013金山西山居创意游戏程序挑战赛——初赛(2) C 卡片游戏 (hdu 4550 )