写了个求梅森素数的程序,输出不正确,求指教,该怎么处理
写了个求梅森素数的程序,输出不正确,求指教
1到8还有第10个都是梅森素数,但是第9个不是,算了下是2^59-1,59也是素数,是我isPrime写错了么?该如何改正?谢谢
(我的思路是用求平方根限定约数的范围,但是作业要求只能用stdio.h不能用math等library,所以我就自己写了个了,思路是如果divisor的平方大于number就跳出循环,问题是所有数字都是正确的只有第9个不对,我用isPrime方法求前1000个质数,跟我用一般的方法求的答案也是对的,找了很久都找不到第9个数错的原因,只好上来求救了)
------解决方案--------------------
#include<stdio.h>
unsigned long long expo = 2;
unsigned long long divisor = 2;
int square = 0;
unsigned long long MersennePrime = 3;//Mersenne prime number(2^p-1)
unsigned long long MersennePrimePlus1 = 4;//Mersenne prime number plus 1 (2^p)
int isPrime(unsigned long long number)
{
if(number ==2)
{
return 1;
}
divisor = 2;
square = (divisor) * (divisor);
while(square<=number)
{
if(number%divisor==0)
{
return 0;//Not prime, return false
}
divisor++;
square = (divisor) * (divisor);
}
return 1;//else return true
}
void Mersenne(int a)
{
if(a>=0&&a<=10)
{
unsigned long long MersennePrime = 3;
unsigned long long MersennePrimePlus1 = 4;
printf("%d mers = ",a);
expo = 2;
while(a>0)
{
if(isPrime(MersennePrime)&&isPrime(expo))
{
printf("%llu ",MersennePrime);
a--;
}
MersennePrimePlus1 = MersennePrimePlus1 * 2;
MersennePrime = MersennePrimePlus1 - 1;
expo++;
}
printf("\n");
}else
{
printf("This program can only compute up to 10 Mersenne primes\n");
}
}
int main(){
Mersenne(10);
getchar();
return 0;
}
- C/C++ code
#include<stdio.h> int expo = 2; int divisor = 2; int square = 0; unsigned long long MersennePrime = 3;//Mersenne prime number(2^p-1) unsigned long long MersennePrimePlus1 = 4;//Mersenne prime number plus 1 (2^p) int isPrime(unsigned long long number) { if(number ==2) { return 1; } divisor = 2; square = (divisor) * (divisor); while(square<=number) { if(number%divisor==0) { return 0;//Not prime, return false } divisor++; square = (divisor) * (divisor); } return 1;//else return true } void Mersenne(int a) { if(a>=0&&a<=10) { unsigned long long MersennePrime = 3; unsigned long long MersennePrimePlus1 = 4; printf("%d mers = ",a); expo = 2; while(a>0) { if(isPrime(MersennePrime)&&isPrime(expo)) { printf("%llu ",MersennePrime); a--; } MersennePrimePlus1 = MersennePrimePlus1 * 2; MersennePrime = MersennePrimePlus1 - 1; expo++; } printf("\n"); }else { printf("This program can only compute up to 10 Mersenne primes\n"); } } int main(){ Mersenne(10); getchar(); return 0; }
1到8还有第10个都是梅森素数,但是第9个不是,算了下是2^59-1,59也是素数,是我isPrime写错了么?该如何改正?谢谢
(我的思路是用求平方根限定约数的范围,但是作业要求只能用stdio.h不能用math等library,所以我就自己写了个了,思路是如果divisor的平方大于number就跳出循环,问题是所有数字都是正确的只有第9个不对,我用isPrime方法求前1000个质数,跟我用一般的方法求的答案也是对的,找了很久都找不到第9个数错的原因,只好上来求救了)
------解决方案--------------------
#include<stdio.h>
unsigned long long expo = 2;
unsigned long long divisor = 2;
int square = 0;
unsigned long long MersennePrime = 3;//Mersenne prime number(2^p-1)
unsigned long long MersennePrimePlus1 = 4;//Mersenne prime number plus 1 (2^p)
int isPrime(unsigned long long number)
{
if(number ==2)
{
return 1;
}
divisor = 2;
square = (divisor) * (divisor);
while(square<=number)
{
if(number%divisor==0)
{
return 0;//Not prime, return false
}
divisor++;
square = (divisor) * (divisor);
}
return 1;//else return true
}
void Mersenne(int a)
{
if(a>=0&&a<=10)
{
unsigned long long MersennePrime = 3;
unsigned long long MersennePrimePlus1 = 4;
printf("%d mers = ",a);
expo = 2;
while(a>0)
{
if(isPrime(MersennePrime)&&isPrime(expo))
{
printf("%llu ",MersennePrime);
a--;
}
MersennePrimePlus1 = MersennePrimePlus1 * 2;
MersennePrime = MersennePrimePlus1 - 1;
expo++;
}
printf("\n");
}else
{
printf("This program can only compute up to 10 Mersenne primes\n");
}
}
int main(){
Mersenne(10);
getchar();
return 0;
}