UVa10006 Carmichael Numbers【素数判定+快速模幂】
问题链接:UVa10006 Carmichael Numbers。
问题简述:参见上述链接。
问题分析:
这是一个卡尔迈勒数判定问题,只要读懂题意就简单了。
卡尔迈勒数是数论中的一个重要概念。
程序说明:
函数isprime()不是一个真正意义上的素数判断函数,只进行奇数判定,对于本题条件是没有问题的。
函数powermod()是模幂计算函数。
AC的C++语言程序如下:
/* UVa10006 Carmichael Numbers */ #include <iostream> #include <cmath> using namespace std; // 试除法判断一个数是否为素数 bool isprime(int n) { int end2, i; end2 = sqrt(n); for(i=3; i<=end2; i+=2) { if(n % i == 0) break; } return i > end2; } // 模幂计算 int powermod(long long a, int n, int m) { long long res = 1; while(n) { if(n & 1) { // n % 2 == 1 res *= a; res %= m; } a *= a; a %= m; n >>= 1; } return res; } int main() { int n; while(cin >> n && n) { if(isprime(n)) cout << n << " is normal." << endl; else { int i; for(i=2; i<n; i++) if(powermod(i, n, n) != i) break; if(i < n) cout << n << " is normal." << endl; else cout << "The number " << n << " is a Carmichael number." << endl; } } return 0; }