uva10006 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=35&page=show

//题目 判断一个数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)