这道题涉及到梅盛素数概念,这个题目有个很好的地方,就是很多数据多已经告诉我们了。
令2^n-1=s,输出n值,只不过还是弄了很久,尤其是前几个数据的处理,其他都还好,可以打表完成。
#include<iostream> #include<cmath> using namespace std; int a[31]={31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,19937, 21701,23209,44497,86243,110503,132049,216091,756839,859433, 1257787,1398269,2976221,3021377,6972593};
int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n>=8)printf("%d\n",a[n-8]); else //这是通过测试程序来得到结果的,很纠结写得不好 { if(n==1)printf("2\n"); else if(n==2)printf("3\n"); else if(n==3)printf("5\n"); else if(n==4)printf("7\n"); else if(n==5)printf("13\n"); else if(n==6)printf("17\n"); else if(n==7)printf("19\n"); } } return 0; } /*测试程序*/ #include<iostream> #include<cmath> using namespace std; int prime(int v) { int n=1,i; for(i=0;i<v;i++) n*=2; n--; if(n==3)return 0; int s=(int)sqrt(n*1.0); for(i=2;i<=s;i++) if(n%i==0)return 1; return 0; } int main() { int i; for(i=2;i<=29;i++) { if(prime(i)) printf("2^%d-1不是素数\n",i); else printf("2^%d-1是素数\n",i); } return 0; } //先留在这儿,以后如果忘记一部分,也好来温习!