梅森尼数(4分)
题目内容:
形如2^i-1的素数,称为梅森尼数。编程计算并输出指数i在[2,n]中的所有梅森尼数,并统计这些梅森尼数的个数,其中n的值由键盘输入,并且n的值不能大于50。其中,2^i表示2的i次方,请不要使用pow(2,i)编程计算,应采用循环累乘求积的方式计算2^i。
提示:当i 超过30以后,2^i-1的值会很大,不能用long型变量来存储,必须使用double类型来存储。对于double类型变量x(不是整型)不能执行求余运算,即不能用 x % i == 0来判断x是否能被i整除,可以使用 x / i == (int)(x/i)来判断x是否能被i整除。
程序运行示例:
Input n:
50↙
2^2-1=3
2^3-1=7
2^5-1=31
2^7-1=127
2^13-1=8191
2^17-1=131071
2^19-1=524287
2^31-1=2147483647
2^49-1=562949953421311
count=9
输入提示信息:"Input n:\n"
输入格式: "%d"
输出格式:
梅森尼数的输出格式: "2^%d-1=%.0lf\n"
统计梅森尼数个数的输出格式: "count=%d\n"
用double可能会有问题,很大的数除以小的数,结果会超出整型的范围。
long long的范围可以满足条件,但是下面程序不能输出2^49-1,原因。1)可能2^49-1不是素数。确实有问题,百度百科上显示没有2^49-1。
1 #include <stdio.h> 2 #include <math.h> 3 4 int prime(long long n) 5 { 6 if(n==1) return 0; 7 long long int i; 8 for(i=2; i<=(long long)sqrt(n); i++,i=(long long)i){ 9 if(n%i==0) 10 break; 11 } 12 if(i>(long long)sqrt(n)) return 1; else return 0; 13 } 14 15 16 17 int main() 18 { 19 printf("Input n:\n"); 20 int n; 21 scanf("%d", &n); 22 long long x = 1; 23 int i = 0; 24 int cnt = 0; 25 for(i=1; i<=n; i++){ 26 x *= 2; 27 //printf("2^%d-1=%lld\n", i, x); 28 if(prime(x-1)){ 29 printf("2^%d-1=%lld\n", i, x-1); cnt++; 30 } 31 } 32 printf("count=%d\n", cnt); 33 return 0; 34 }