【深入浅出程序设计竞赛】:强制类型转换、四舍五入

205 阅读2分钟

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

强制类型转换

例 2-3 玩橡皮泥。

小 A 有两块球形橡皮泥,一个半径是 44 ,另一个半径是 1010。他想把这两块橡皮泥揉在一起,然后塑造成一个正方体。请问:这个正方体的边长是多少?如果结果不是整数,则舍去小数点之后的数字。取π=3.141593\pi = 3.141593

分析:

  • 已知球半径求体积的公式:V=43πr3V = \frac{4}{3} \pi r^3
  • 因此,总橡皮泥的体积:43π(43+103)\frac{4}{3} \pi \left( 4^3 + 10^3 \right)
  • 因为正方体的边长就是体积的立方根,所以答案为:43π(43+103)3\sqrt[3]{\frac{4}{3} \pi \left( 4^3 + 10^3 \right)}

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define PI 3.141593

int main() {
    int r1 = 4, r2 = 10;
    double V, ans;
    V = 4.0 / 3 * PI * (r1*r1*r1 + r2*r2*r2);
    ans = pow(V, 1.0 / 3);
    cout << (int)ans;
    return 0;
}

运行结果为:

16

可以看到,上述代码中,使用了 pow() 函数来计算立方根,得到正方体边长的准确数值,而在输出答案的过程中,使用了强制类型转换的方法来将一个浮点数 ans 转变为整数,即舍去小数点之后的数字。

当然,就本题而言,我们也可以将 ans 定义为 int 类型,这样当 pow() 函数计算完之后赋值给整数变量 ans 后就会自动转换为整数(代价是失去小数点之后的数字)。

之前记录过如何将整数转换为浮点数(加 .0 或者乘上 1.0),如果是通过强制类型转换的方式,则是使用 (double)3 也能达到转变为浮点数的效果。

四舍五入

例 2-4 销量预测。

根据咕咕网校的预测,当课程定价为 110 元时,会有 10 人报名。如果课程价格每降低 1 元,就会多 1 名报名者,反之亦然。如果希望总共能收到 3500 元学费,那么应该定价多少呢?已知本题有两个答案符合要求,则取较小的那一个。如果这个答案不是整数,则需四舍五入精确到整数。

分析:

  • 假设课程价格降低 xx 元,那么定价就是 110x110-x 元,报名人数是 10+x10+x
  • 可以列出公式:(110x)(10+x)=3500(110-x)(10+x)=3500
  • 化简得:$x^2-100x+2400=0
  • 根据二次方程求根公式:x1,2=b±b24ac2ax_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
  • 最后再取值较大的那个根即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    double a = 1, b = -100, c = 2400;
    double d, ans;
    d = pow(b, 2) - 4 * a * c;
    ans = ( -b + sqrt(d) ) / ( 2 * a );
    cout << 110 - int(ans + 0.5);
    return 0;
}

运行结果:

50

在上述代码中,ans = ( -b + sqrt(d) ) / ( 2 * a )其实就是求根公式x1=b+b24ac2ax_{1} = \frac{-b + \sqrt{b^2 - 4ac}}{2a},其中 d 就是 b24acb^2 - 4ac

注意,这里的 int(ans + 0.5) 的意思就是四舍五入到整数,将 ans 加上0.5之后再进行强制类型转换为 int,去除小数部分,就可以达到四舍五入的目的。