• 算法竞赛入门经典_4.1_判定素数_组合数


      又是两天没写博客了.

    今天我直接把第三章的练习跳过了,先把后面的基础看完.

    这节内容是自定义函数和结构体,下面是简单的函数和结构体定义

    typedef struct {double x, y;}Point;
    
    double dist(Point a, Point b)
    {
      return hypot(a.x - b.x, a.y - b.y);  
    }

    其中,hypot的函数意思是平方和开根号.

    1.组合数

    注:  在算法竞赛中,除了有特殊规定之外,请总是让main函数返回0;

       即使最终答案在所选则的数据类型的范围之内,计算的中间变量仍然可能溢出;

       看代码

    //组合数 2017-8-20
    
    #include <stdio.h>
    
    long long C(int n, int m) {
        if (m < n - m) m = n - m;
        long long ans = 1;
        for (int i = m + 1; i <= n; i++) ans *= i;
        for (int i = 1; i <= n - m; i++) ans /= i;
        return ans;
    }
    int main()
    {
        int n, m;
        int ans;
        scanf("%d%d", &n, &m);
        ans = C(n, m);
        printf("%d
    ", ans);
        return 0;
    }

    这个程序就本来是存在溢出的,现在通过约分处理,就完全避免了中间变量引起的溢出了


    运行结果

    2.素数的判定

    说到这里,博主记得刚进大学时连素数是什么都不明白,在这里特把素数的定义罗列一下,复习小学知识

    素数定义:被1和它本身整除的,大于1的整数称为素数.

    代码:

    //素数判定 2017-8-20
    
    #include <stdio.h>
    #include <math.h>
    int is_prime(int n) {
        if (n <= 1) return 0;
        int m = floor(sqrt(n) + 0.5);
        for (int i = 2; i <= m; i++)
            if (n % i == 0)
                return  0;
        return 1;
        
    }
    int main()
    {
        int n;
        int ans;
        scanf("%d", &n);
        ans = is_prime(n);
        printf("%d
    ", ans);
        return 0;
    }
    • 注:   判断一个事物是否具有某一性质叫做谓词(predicate),比如判断人是否具有懒惰性,is_lazy,对于命名可以用,is_xxx表示
    • 编写函数的时候,应尽量保证该函数能对任何合法参数得到正确的结果,就像上面的代码,如果不判段这个数是否小于等于1,就得不到正确的结果了,,此时,应在显著位置标明函数的缺陷,以必免被错误调用.
    • 特别的,在上面的代码中,通过取得开根号数直接判断,+0.5的目的是避免浮点误差.

     运行结果:

  • 相关阅读:
    GODIAG GD801 ODOMETER里程改正指南车清单
    XTOOL A80 Pro(H6 Pro)使用提示+常见问题解答
    Vident IAUTO702 Pro 2012 Peugeot 308喷油器编码:是否支持?
    es创建模板
    docker 帮助信息
    聊聊白盒测试、黑盒测试
    Go 通过结构体指定字段进行排序
    Go语言 之结构体数组 赋值
    PHP中json_encode与json_decode
    golang sync WaitGroup
  • 原文地址:https://www.cnblogs.com/ncgds/p/7402148.html
Copyright © 2020-2023  润新知