From算法竞赛入门经典 第2版
- 1.判断 n 是否为完全平方数
- 2. 比较大的数组应尽量声明在 main 函数外,否则程序可能无法运行
- 3.开灯问题
1.判断 n 是否为完全平方数
可以先求出其平方根,然后看它是否为整数,即用一个 int 型变量 m 存储 sqrt(n)四舍五入后的整数,然后判断 m*m 是否等于 n
可不可以这样写?
(直接判断 sqrt(n)是否为整数。)
if(sqrt(n) == floor(sqrt(n)))
printf("%d是完全平方数\n", n)
理论上当然没问题,但这样写不保险,因为浮点数的运算(和函数)有可能存在误差。
假设在经过大量计算后,由于误差的影响,整数 1 变成了 0.9999999999,floor 的结果会是 0 而不是 1。为了减小误差的影响,一般改成四舍五入,即 floor(x+0.5)。如果难以理解,可以想象成在数轴上把一个单位区间往左移动 0.5 个单位的距离。floor(x)等于 1 的区间为[1,2),而 floor(x+0.5)等于 1 的区间为[0.5, 1.5)
2. 比较大的数组应尽量声明在 main 函数外,否则程序可能无法运行
3.开灯问题
题目:有 n 盏灯,编号为 1~n。第 1 个人把所有灯打开,第 2 个人按下所有编号为
2 的倍数的开关(这些灯将被关掉),第 3 个人按下所有编号为 3 的倍数的开关(其中关掉
的灯将被打开,开着的灯将被关闭),依此类推。一共有 k 个人,问最后有哪些灯开着?
输入 n 和 k,输出开着的灯的编号。k≤n≤1000
虽然也能用for 循环把arr清零,但是用 memset 又方便又快捷。另一个技巧在输出:为了避免输出多余空格,设置了一个标志变量 first,可以表示当前要输出的变量是否为第一个。第一个变量前不应有空格,但其他变量都有。