算法竞赛入门经典_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的目的是避免浮点误差.

 运行结果:

原文地址:https://www.cnblogs.com/ncgds/p/7402148.html