又是两天没写博客了.
今天我直接把第三章的练习跳过了,先把后面的基础看完.
这节内容是自定义函数和结构体,下面是简单的函数和结构体定义
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\n", 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\n", ans); return 0; }
- 注: 判断一个事物是否具有某一性质叫做谓词(predicate),比如判断人是否具有懒惰性,is_lazy,对于命名可以用,is_xxx表示
- 编写函数的时候,应尽量保证该函数能对任何合法参数得到正确的结果,就像上面的代码,如果不判段这个数是否小于等于1,就得不到正确的结果了,,此时,应在显著位置标明函数的缺陷,以必免被错误调用.
- 特别的,在上面的代码中,通过取得开根号数直接判断,+0.5的目的是避免浮点误差.
运行结果: