题目的意思就是要求找出n 满足一下两个条件
1. n不是素数 .
2.对于任何比n小的数a 都有 pow (a , n) % n == a;
首先判断是不是素数.
然后用幂取模遍历所有小于n的a来求是不是满足第二个条件就行了.
AC代码:
#include<stdio.h>
#include<math.h>
int num;
int pow_mod(int a ,int n ,int m) {
if(n == 1)
return a;
int x = pow_mod(a , n / 2 , m);
long long ans = (long long) x * x % m;
if(n % 2 == 1)
ans = ans * a % m;
return (int)ans;
}
int main () {
int num;
while(scanf("%d",&num) && num) {
bool flag = false;
for (int i = 2 ; i < sqrt(num) ; i++) {
if(num % i == 0) {
flag = true;
break;
}
}
if(!flag) {
printf("%d is normal.\n",num);
continue;
}
flag = false;
for (int i = 1 ; i < num ;i++) {
if(pow_mod(i , num , num) != i) {
flag = true;
break;
}
}
if(!flag)
printf("The number %d is a Carmichael number.\n",num);
else
printf("%d is normal.\n",num);
}
}