【深入浅出程序设计竞赛】:浮点数相等判断、随机数、计数问题

254 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

浮点数是否相等

一般我们不会用 == 来判断两个浮点数是否相等,这是因为浮点数可能会产生精度误差。

正确的方法就是比较这两个浮点数的差值是否足够小(小于一定程度)。例如,假设现在有两个浮点数变量 ab ,如果 fabs(a-b) < 1e-6 成立,那么就可以认为这两个浮点数相等。至于差值要小到多少,具体看实际需求,一般来说不超过 1e-6 即可。

min 和 max

min()max() 函数可以用于获取较小值和较大值。

注意,需要导入 <algorithm> 头文件。

比如:

minNum = min(a, b);

上述语句的意思是变量 minNum 取 a 和 b 的较小值。

随机数

为了让计算机产生一个随机数,我们可以使用 rand() 函数来产生一个 0 到 RAND_MAX 的整数。其中 RAND_MAX 是一个常量,其值与编译器和系统有关。而且别忘了加上头文件 <cstdlib>

我们可以使用 rand() % a 来产生一个 0 到 a - 1 的随机数。如果想产生一个 a 到 b 的随机数,则可以使用 rand() % (b-a+1) + a

一般来说,Windows 下的 RAND_MAX 值为 32767,而 Linux 下,其值为 int 的最大值。

计算机通过特定的算法( rand() 函数)来生成 “伪随机数”,因此每次执行随机数算法 rand() 之前,一般都需要“喂给它”不同的初始值作为随机数种子,这里使用 srand() 函数。注意,只有生成随机数种子后,算法生成的不同随机数才能是比较好的。这里喂给它当前的时间就是一个比较好的选择,即 srand(time(0))(需要导入头文件 <ctime>).

[NOIP2013 普及组] 计数问题

  • 题目描述

试计算在区间 11nn 的所有整数中,数字 xx0x90\le x\le9)共出现了多少次?例如,在 111111 中,即在 1,2,3,4,5,6,7,8,9,10,111,2,3,4,5,6,7,8,9,10,11 中,数字 11 出现了 44 次。

  • 输入格式

22 个整数 n,xn,x,之间用一个空格隔开。

  • 输出格式

11 个整数,表示 xx 出现的次数。

  • 样例输入
11 1
  • 样例输出
4
  • 提示

对于 100%100\% 的数据,1n1061\le n\le 10^60x90\le x \le 9

  • 分析:

1n 枚举,将每一个值赋给一个临时变量,比如 temp,然后处理 temp。这里得创建一个计数器变量 count,接着对于每一个 temp,首先除以 10 取余数(%10),这样就得到它的个位数,再判断该数是否等于 x。如果等于 x ,则计数器自增加一。接着把 temp 自除 10,这样就把原来的个位数去掉了。最后再重复之前的流程即可。

  • 代码举例: