您的位置:首页 > 其它

UVA 10006 判断一个数是否为一个卡米切尔数

2011-04-22 14:07 267 查看
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=12&problem=947&mosmsg=Submission+received+with+ID+8768565

这个题目应该是数论中比较入门的题目了

因为数据量并不是很大,所以可以直接暴力的打出素数表,然后进行判断

不过在取mod的时候可以把线性的乘法改成二分取mod,提升速度,然后就是变量类型可以改成long

int是会WA的,其他的就没有啥好主意的了。

我的代码:

#include<stdio.h>
#include<math.h>
#include<string.h>

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
)
{
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐