这个题目应该是数论中比较入门的题目了
因为数据量并不是很大,所以可以直接暴力的打出素数表,然后进行判断
不过在取mod的时候可以把线性的乘法改成二分取mod,提升速度,然后就是变量类型可以改成long
int是会WA的,其他的就没有啥好主意的了。
我的代码:
long prime[65005];
long num;
bool flag[65005];
void init()
{
unsigned long i,j;
memset(flag,0,sizeof(flag));
flag[1]=true;
for(i=2;i<65005;i++)
{
if(!flag[i])
{
prime[num++]=i;
for(j=i*i;j<=65005;j=j+i)
flag[j]=true;
}
}
}
long power(long a,long n,long m)
{
long t;
if(n==0)
return 1%m;
if(n==1)
return a%m;
t=power(a,n/2,m);
t=((t%m)*(t%m))%m;
if((n&1)==1)
t=((t%m)*(a%m))%m;
return t;
}
bool judge(long n)
{
long i;
for(i=2;i<=n-1;i++)
if(power(i,n,n)!=i)
return false;
return true;
}
int main()
{
long n;
init();
while(scanf("%ld",&n)!=EOF)
{
if(n==0)
break;
if(!flag[n])
{
printf("%ld is normal./n",n);
continue;
}
else
{
if(judge(n))
printf("The number %ld is a Carmichael number./n",n);
else
printf("%ld is normal./n",n);
}
}
return 0;
}