C语言有问题代码

 
梅森尼数(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 }

猜你喜欢

转载自www.cnblogs.com/candyYang/p/12624262.html