zoukankan      html  css  js  c++  java
  • HDU4548 美素数

    问题链接HDU4548 美素数基础练习题,用C语言编写程序。

    问题简述:参见上述链接。

    问题分析美素数定义为一个数是素数并且其各位数字之和也是素数。

    本题的目的是计算某个区间的美素数的个数。类似这样的问题,不能每次判定,否则计算上必然超时,所以需要打表。

    程序中,使用了两个函数来判定一个数是否为美素数。判定一个数是否为素数使用的是试除法,比起筛选法速度相对慢一些。

    另外计算区间[a, b]的美素数个数时,公式是ans[b]-ans[a-1](注意-1)。

    程序说明(略)。

    AC的C语言程序如下:

    /* HDU4548 美素数 */
    
    #include <stdio.h>
    #include <math.h>
    
    #define MAXN 1000000
    
    int ans[MAXN+2] = {0, 0, 1};    // ans[i] 为0到i的美素数个数
    
    // 试除法判断一个数是否为素数
    int isprime(int n)
    {
        if(n == 2)
            return 1;
    
        if((n & 1) == 0)  // 偶数:n % 2 == 0
            return 0;
    
        int end = sqrt(n), i;
        for(i=3; i<=end; i+=2) {
            if(n % i == 0)
                break;
        }
    
        return i > end ? 1 : 0;
    }
    
    // 计算各位数字和
    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
    ", i, ans[r] - ans[l-1]);
        }
    
        return 0;
    }


  • 相关阅读:
    jvm调优监控工具jps、jstack、jmap、jhat、jstat使用详解
    JS中Date和时间戳转换
    HashMap源码窥探
    HashMap,TreeMap,LinkedHashMap的默认排序
    hibernate-delete(Entity)的顺序问题
    macOS通过ssh使用PEM登录
    SpringMvc-<context:component-scan>使用说明
    macOS安装RZ,SZ
    CentOS6.8下yum安装Nginx
    第K人||约瑟夫环(链表)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564626.html
Copyright © 2011-2022 走看看