梅森素数啊,啊哈哈,其实这题最快的做法是打表,但是打表有点太无语了,不过我还是贴了代码。
题意:判断所有质数i<=k,2^i-1是否是质数,不是的话就要将它分解质因数输出来。
代码如下
#include <stdio.h>
#include <string.h>#include <stdlib.h>
#include <math.h>
__int64 num[70]={1},queue[10];
int Prime(int x)
{
int i;
for(i=2;i*i<=x;i++)
{
if(x%i==0&&x!=2)
return 0;
}
return 1;
}
void main()
{
int k;
int i,flag,ans;
__int64 p,j;
for(i=1;i<64;i++)
num[i]=num[i-1]*2;
scanf("%d",&k);
for(i=2;i<k;i++)
{
flag=0;
if(Prime(i)==1)
{
p=num[i]-1;
ans=0;
for(j=2;j*j<=p;j++)
{
while(p%j==0)
{
queue[ans++]=j;
p/=j;
flag=1;
}
}
if(flag==1)
{
queue[ans]=p;
printf("%lld",queue[0]);
for(j=1;j<=ans;j++)
printf(" * %I64d",queue[j]);
printf(" = %I64d = ( 2 ^ %d ) - 1\n",num[i]-1,i);
}
}
}
}
打表做法
#include <stdio.h>#include <stdlib.h>
#include <string.h>
void main()
{
int f[10] ={ 11, 23, 29, 37, 41, 43, 47, 53, 59 };
int n,i;
char st[10][100] ={ "23 * 89 = 2047 = ( 2 ^ 11 ) - 1",
"47 * 178481 = 8388607 = ( 2 ^ 23 ) - 1",
"233 * 1103 * 2089 = 536870911 = ( 2 ^ 29 ) - 1",
"223 * 616318177 = 137438953471 = ( 2 ^ 37 ) - 1",
"13367 * 164511353 = 2199023255551 = ( 2 ^ 41 ) - 1",
"431 * 9719 * 2099863 = 8796093022207 = ( 2 ^ 43 ) - 1",
"2351 * 4513 * 13264529 = 140737488355327 = ( 2 ^ 47 ) - 1",
"6361 * 69431 * 20394401 = 9007199254740991 = ( 2 ^ 53 ) - 1",
"179951 * 3203431780337 = 576460752303423487 = ( 2 ^ 59 ) - 1" };
while(scanf("%d", &n)==1)
{
for (i = 0; i < 9; i++)
if (f[i] <= n)
printf("%s\n", st[i]);
}
}