求测试下面程序以及一连串的问题
因为原题不是正式版~把题目贴出来不太好看,我还是简单描述一下算了~题目很简短--判断2^62范围内的质数,是就输出yes,不是就输出no
我自己写了个,但由于AC32位不支持long long 型,无法进行高位测试,想知道高位极限测试效率如何~
程序代码:
/*题目,判断2^62范围内的质数--效率至上!!!(我vc不支持long long 型,固无法进行高位测试--有兴趣的可以改改数据类型)*/ #include<stdio.h> #include<stdlib.h> #include<math.h> #define STEP 10//选取推导循环步长周期的质数基数(在允许的范围内,STEP越大,遍历时间越短(但预备时间越长),STEP最好不要超过11(不要低于4)) int fun(char *b,int s[]);//求每个步长 int sum(int s[]);//求周期数 void set(int s[]);//求质数基数以及每个质数的数值 int judge_1(int s[],int n); int judge_2(int s[],int n); int judge_3(int s[],int n); int judge_1(int s[],int n) { int i=0; for (i=0;i<STEP-3;i++) if (n%s[i]==0) return 0; return 1; } int judge_2(int s[],int n) { int i=0; for (i=0;i<STEP-2;i++) if (n==s[i]) return 1; return 0; } int judge_3(int s[],int n) { int i=0; for (i=0;i<STEP-2;i++) if (n%s[i]==0) return 1; return 0; } int fun(char *b,int s[]) { int i=0; int a=s[STEP-2]; char *p=b; int kk=sum(s); for (i=s[STEP-1];i<=s[STEP-2]+kk;i++) if (judge_1(s,i)) { *p++=i-a;//这里用指针能提高运行效率 a=i; } return p-b; } void set(int s[]) { int i=0; int j=0; int k=0; for (i=2;k<STEP;i++) { for (j=2;j<=(int)sqrt(i);j++) if (i%j==0) break; if (j==(int)sqrt(i)+1) s[k++]=i; } } int sum(int a[]) { int i=0; int sum=1; for (i=0;i<STEP-3;i++) sum*=a[i]; return sum; } int main() { char *a=NULL;//char 型看完程序框架分析知道,char型其实存放小数据,能节省空间(虽然还是浪费了不少空间)~ int step=0; int s[STEP]={0}; int n=0; int i=0; int flag=0; set(s);//求质数基数以及每个质数的数值 a=(char *)calloc(sum(s),sizeof(char));//使用动态内存分配能最大限度减少空间损失 step=fun(a,s); while (scanf("%d",&n)!=EOF) { char *p=NULL;//用指针提高运行效率 flag=1; if (n<2) flag=0; else if (judge_2(s,n)) flag=1; else if (judge_3(s,n)) flag=0; for (i=s[STEP-2],p=a;i<=(int)sqrt(n)&&flag;i+=*p++) { if (n%i==0) flag=0; if (p==a+step) p=a; } if (flag) printf("yes\n"); else printf("no\n"); } free(a); return 0; }
下面有几个我想解决的问题:
首先,接受极限测试得先把关键数据改为long long 型~
1:算法有没有问题~结果是否会出错~
2:设STEP=10或者STEP=11如果题目要求每组测试数据要在1s内得出正确结果~极限测试会不会超时~
3:STEP 取值感觉取7到11的执行效率都差不多~是不是STEP对执行效率影响不大~还有STEP的最佳取值为多少~
4:听说用指针遍历数组能提高执行效率~但初步尝试用数组和指针效率差不多~事实是不是这个样子的~
5:对这题有没有什么较好的算法~可以拿出来交流一下~
[此贴子已经被作者于2017-1-9 22:11编辑过]