1040:输出绝对值

1040:输出绝对值

时间限制: 1000 ms    内存限制: 65536 KB

【题目描述】

输入一个浮点数,输出这个浮点数的绝对值,保留到小数点后两位。

【输入】

输入一个浮点数,其绝对值不超过10000。

【输出】

输出这个浮点数的绝对值,保留到小数点后两位。

【输入样例】

-3.14

【输出样例】

3.14

说明:
主要考查使用if条件语句解决绝对值问题。
所谓绝对值,在这里可以简单理解为:一个正数的绝对值是其本身,一个负数的绝对值是它的相反数,0的绝对值是0。
例如,-4的绝对值是4,4的绝对值是4。
在数学中用|x|来表示x的绝对值。而在C/C++中没有绝对值运算符。

思路分析:

输入一个浮点数,可以用数学的方法解决,也可以用编程的方法解决,下面将介绍几种入门者应该掌握的方法。

正正得正、正负得负(负正得负)、负负得正。即两个数相乘、除的口诀。两个正数或负数相乘或相除,其结果时正数,否则是负数。

例如,-3×(-3)=9,-3×3=-9。

而一个实数乘以或除以1等于其本身,例如-3×1=-3,4×1=4。那么乘以-1就等于其本身的相反数了。这就是其中的一种方法。

而一个数加上一个负号“-”,就变为相反数,例如3加上一个负号就变为-3,而-3加一个负号就变为-(-3),而根据负负得正,-(-3)其实就是3。这也是一种方法。

上面两种方法都是使用数学的方法,现在介绍C/C++编程的方法。C/C++有求绝对值的函数,例如abs、fabs等。

abs函数用于整数,而fabs用于浮点数。所以本题应该使用fabs函数。

abs函数和fabs函数所在的头文件:

C语言:<math.h>

C++:<cmath>

具体用法可见答案代码。

数据类型方面,题目要求输入的是浮点数,并且不超过10000,保留到小数点后两位。对于C++而言,可以用float类型或double类型,甚至是long double类型。对于C语言而言,虽然也可以选择这三种类型,不过每个类型对应不一样的函数。在下方《延伸学习》中将详细讲解到。

求解过程(方法2):
声明一个double类型变量x。
输入一个数给变量x。
如果变量x是负数,则把变量x变为正数。
输出变量x的值。

延伸学习:
你可以能会问,一个fabs函数,为什么可以用三种浮点型变量?例如使用float类型、double类型、long double类型。
因为fabs函数被重载了。所谓重载,如果不明白,可以简单地理解为,fabs有3个函数,但名字都是fabs,它们的函数原型分别是(以C++98标准为例):

float fabs(float x);

double fabs(double x);

long double fabs(long double x);

当传入的变量是float类型时,就会调用第一个fabs函数,C++编译器会自动识别的。甚至在C++11标准开始使用模板。

C99标准,3种浮点型分别对于3个函数,函数原型如下:

float fabsf(float x);

double fabs(double x);

long double fabsl(long double x);

如果GCC编译器版本过旧,可能不太支持与long double类型相关的一些特性。

在奥赛中,不建议使用long double类型。

以上所有绝对值函数返回的值都是精确的,不会进行任何的舍入模式。

参考代码 - C++:

// 方法1

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    float x;
    cin >> x;
    if (x < 0) x *= -1;    // 如果x小于(负数),则乘以-1变为正数
    cout << fixed << setprecision(2) << x;
    return 0;
}

// 方法2

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    double x;
    cin >> x;
    if (x < 0) x = -x;    // 如果x小于0(负数),则给x添加负号,让x变为正数
    cout << fixed << setprecision(2) << x;
    return 0;
}

// 方法3

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    long double x;
    cin >> x;
    cout << fixed << setprecision(2) << fabs(x);
    return 0;
}

参考代码 - C语言:

将展示上述的3个函数,注意不同浮点型输入时的格式字符:

float对应"%f"

double对应"%lf"

long double对应"%Lf"

对于printf函数:在前面的题解中可能以"%f"的形式来写,因为之前没有使用long double类型。根据C99标准的描述,对于float类型和double类型,可以使用"%f",但对于long double类型,应使用"%Lf"。

对于下面代码的方法3,提交后是错误的,因为该版本的GCC对long double类型的支持不友好。所以这也是为什么会说,对于奥赛的同学,不建议使用long double类型的原因之一。

// 方法1(float类型的fabsf函数)

#include <stdio.h>
#include <math.h>
int main()
{
    float x;
    scanf("%f", &x);
    printf("%.2f", fabsf(x));
    return 0;
}

// 方法2(double类型的fabs函数)

#include <stdio.h>
#include <math.h>
int main()
{
    double x;
    scanf("%lf", &x);
    printf("%.2lf", fabs(x));
    return 0;
}

// 方法3(long double类型的fabsl函数)

#include <stdio.h>
#include <math.h>
int main()
{
    long double x;
    scanf("%Lf", &x);
    printf("%.2Lf", fabsl(x));
    return 0;
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值