UVA10006 Carmichael Numbers(数论)

题目链接

分析:

很简单,只是用到了一个模运算的公式。

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;
}

 

 

posted on 2013-04-04 14:49  Still_Raining  阅读(259)  评论(0编辑  收藏  举报