思路:直接判是不是素数然后满不满足费马小定理就行了
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> using namespace std; #define maxn 66000 int vis[maxn]; void Prime() { memset(vis,1,sizeof(vis)); vis[0]=vis[1]=0; for(int i=2;i*i<maxn;i++) if(vis[i]) for(int j=2*i;j<maxn;j+=i) vis[j]=0; } long long Pow(long long a,long long b,long long mod) { long long ans=1; while(b) { if(b&1) { b--; ans=(ans*a)%mod; } else { b/=2; a=(a*a)%mod; } } return ans; } bool is_ok(long long n) { bool ans=1; for(int i=2;i<n;i++) { if(Pow(i,n,n)!=i) { ans=0; break; } } return ans; } int main() { Prime(); int n; while(scanf("%d",&n),n) { if(!vis[n]&&is_ok(n)) printf("The number %d is a Carmichael number. ",n); else printf("%d is normal. ",n); } return 0; }