华为上机真题 2022取近似值
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022取近似值相关的知识,希望对你有一定的参考价值。
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!
一、题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 5, 向上取整;小于 5,则向下取整。
1.1 输入描述
输入一个正浮点数值
1.2 输出描述
输出该数值的近似整数值
二、测试样例
输入
5.5
输出
6
三、解题思路
本题可以通过两种方法求解。
3.1 方法一
通过字符串处理正浮点数,判断第一位小数是否大于等于 5,如果是则模拟将整数部分的字符串加 1,否则,输出整数部分的字符串。
3.2 方法二
将输入值乘以 10,取整后取余数,此时,余数为第一位小数,然后,判断余数是否大于等于 5,如果是则将输入值加 1。最后将输入值取整输出。
四、代码实现
4.1 方法一
通过字符串处理输入值,代码如下所示。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//将字符串里存储的整数加 1
string strAddOne(string str)
string ans;
bool flag = true;
for (int i = str.size() - 1; i >= 0; --i)
if (!flag)
str = str.substr(0, i + 1);
reverse(str.begin(), str.end());
ans += str;
break;
if (str[i] == '9') // 如果是 9,则进一
ans += '0';
else
flag = false;
ans += (str[i] + 1);
if (flag) // 注意最后还有进位的情况
ans += '1';
reverse(ans.begin(), ans.end());
return ans;
string slove(string str)
bool flag = false;
int idx = str.find('.'); //判断是否可以进位
if (idx + 1 < (int)str.size() && str[idx + 1] >= '5')
flag = true;
str = str.substr(0, idx);
return flag ? strAddOne(str) : str;
int main()
string str;
while (cin>>str)
if (str.find('.') == string::npos) // 判断是否存在小数部分
cout<<str<<endl;
else
cout<<slove(str)<<endl;
return 0;
4.2 方法二
通过取余判断第一位小数,代码如下所示。
#include <iostream>
#include <string>
using namespace std;
int main()
double ans;
while(cin>>ans)
int rem = (int)(ans * 10) % 10; // 取得小数点后第一个小数的值
if (rem >= 5) // 判断小数的值
ans += 1;
cout<<(int)ans<<endl; // 取整
return 0;
五、时间复杂度
方法一的时间复杂度为 O(1),方法二的时间复杂度为 O(n),其中,n 为字符串的长度。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞
以上是关于华为上机真题 2022取近似值的主要内容,如果未能解决你的问题,请参考以下文章