//题目 判断一个数n:
//1.是合数
//2.满足a^n mod n=a。
//方法:
//利用素数打表求出max之内的所有素数
//然后利用二分思想快速幂取模运算
//可以尝试一下打表做 将max内的满足的数全部找出来。
#include<stdio.h>
#include<math.h>
#include<string.h>
#define max 65010
int Prim[max];
void if_prim()//素数打表
{
memset(Prim,-1,sizeof(Prim));
int big=(int)sqrt(max)+1;
for(int i=2; i<=big; i++)
if(Prim[i])
for(int j=i*i; j<max; j+=i)
Prim[j]=0;
}
long long powmod(int a, int n, int m) //利用二分思想快速幂取模运算。
{
long long res;
if(n == 1)
return a % m;
res = powmod(a, n / 2, m);
res = (res * res)% m;
if(n % 2)
return (res * a) % m;
else
return res;
}
int main()
{
if_prim();
int n;
int a;
int flag;
for(int n=2;n<max;n++)
{
flag=0;
if(Prim[n]==-1)
{
printf("%d is normal.\n",n);
continue;
}
for(int i=2; i<n; i++)
{
if(powmod(i,n,n)!=i)
{
printf("%d is normal.\n",n);
flag=1;
break;
}
}
if(flag==0)
printf("The number %d is a Carmichael number.\n",n);
}
return 0;
}
uva10006 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=35&page=show
最新推荐文章于 2018-04-09 20:18:38 发布