题目链接。
分析:
很简单,只是用到了一个模运算的公式。
xy mod n = (x mod n)y mod n
递归调用函数就OK了。
注意:
int 是存不了的。看n很小,没注意,用int WA了很多次。因为65000^2=4225000000,很大哦。所以可以用unsigned 或者是 long之类的
#include <stdio.h> #include <stdlib.h> long is_prime(long n){ int i; for(i=2; i*i<=n; i++){ if(n % i == 0) break; } if(i*i<=n) return 0; else return 1; } long expo(long a, long n, long b){ a %= b; if(n == 1) return a; if(n % 2 == 0){ return expo(a*a, n/2, b); } else{ return (expo(a*a, n/2, b)*a)%b; } } int main(){ int i; long n; while(scanf("%ld", &n) == 1 && n){ if(is_prime(n)) printf("%ld is normal.\n", n); else{ for(i=2; i<n; i++) if(expo(i, n, n) != i) break; if(i >= n) printf("The number %ld is a Carmichael number.\n", n); else printf("%ld is normal.\n", n); } } return 0; }