美素数

#include <iostream>
#include<string.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define MAXN 1000000
int ans[MAXN+2] = {0, 0, 1};
int isprime(int n)
{
    if(n == 3||n==2)
        return 1;
	if(n==1)
		return 0;
 
    int temp, i;
    temp = n % 6;
    if(temp != 1 && temp != 5)
        return 0;
 
    temp = sqrt(n);
    for(i=3; i<=temp; i+=2)
        if(n % i == 0)
            return 0;
 
    return 1;
}

int digitsum(int val)
{
    int result = 0;
 
    while(val) {
        result += val % 10;
        val /= 10;
    }
 
    return result;
}
void setans()
{
    int sum = 1, i;
 
    for(i=3; i<=MAXN; i+=2) {
        if(isprime(i) && isprime(digitsum(i)))
            sum++;
        ans[i] = sum;
        ans[i+1] = sum;
    }
}
int main()
{
    int t, l, r, i;
 
    // 打表
    setans();
 
    scanf("%d", &t);
    for(i=1; i<=t; i++) {
        // 读入区间
        scanf("%d%d", &l, &r);
 
        // 输出结果
        printf("Case #%d: %d\n", i, ans[r] - ans[l-1]);
    }
 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42304949/article/details/90139137