现在的位置: 首页 > 综合 > 正文

poj1142

2013年07月22日 ⁄ 综合 ⁄ 共 800字 ⁄ 字号 评论关闭

题目:http://poj.org/problem?id=1142
简单题,之前在joj上做过,而且直接枚举就过了,只是不明白的是为什么joj上那个代码交上去16ms,而现在这个交上去154ms,能优化的尽量优化也只是110ms
代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#define MAXN 32000
int is_prime[MAXN];
bool number[MAXN];
void find_prime() {
    memset(number, false, sizeof(number));
    int cnt = 0;
    for(int i = 2; i < MAXN; ++ i) {
        if(!number[i]) {
            is_prime[cnt ++] = i;
            for(int j = i * i; j < MAXN; j += i) {
                number[j] = true;//写文章时发现这里写错了,居然还A了,改过来后果然是16ms
            }
        }
    }
}
 
int num_of_digit(int n) {
    int sum_digit = 0;
    while(n != 0) {
        sum_digit += n % 10;
        n /= 10;
    }
    return sum_digit;
}
 
bool is_smith_num(int n) {
    int s = num_of_digit(n);
    int sum_prime = 0;
    int m = sqrt(n);
    for(int i = 0; is_prime[i] <= m && n != 1; ++ i) {
        while(n % is_prime[i] == 0) {
            sum_prime += num_of_digit(is_prime[i]);
            n /= is_prime[i];
        }
    }
    if(sum_prime == 0) {
        return false;
    }
    if(n > 1) {
        sum_prime += num_of_digit(n);
    }
    if(s == sum_prime) {
        return true;
    }
    return false;
}
 
int main() {
    freopen("poj1142.txt", "r", stdin);
    int N;
    find_prime();
    while(scanf("%d", &N), N) {
        for(int n = N + 1; ; ++ n) {
            if(is_smith_num(n)) {
                printf("%d\n", n);
                break;
            }
        }
    }
    return 0;
}

抱歉!评论已关闭.