云计算百科
云计算领域专业知识百科平台

【C++】 刷题一星期的小总结(包括求最大值,用数组储存包含空格的字符串、向上取整)

1.求最大值或最小值

对一个初学者来说,在刷题的时候遇到这种求解,最大值和最小值是特别常见的,大家在遇到这种问题的时候,是用什么方法在解决呢?这里提供两种写法供大家参考

1.1 常规写法

第一种写法。相信大家在初学编程语言的时候一定都这么干过

#include<iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
int max = a;

if (b > max)
max = b;

if (c > max)
max = c;
return 0;
}

这种方法的本质就是先随便指定一个数为最大值,然后再通过比较和赋值的操作来调整。

这种方法的好处就是极其适合初学者,但是这会让代码显得冗余,如果想让代码更简洁、更 “C++ 风格”,这里有几个更好的方案:

1.2 利用库函数实现(一行搞定)

#include <iostream>
#include <algorithm> // 显式包含头文件,确保 std::max 可用

using namespace std;

int main()
{
int a, b, c;
cin >> a >> b >> c;

// 方案1:嵌套调用 std::max
int max_val = max(max(a, b), c);

// 方案2:C++11及以后支持初始化列表,更直观
int max_val = max({a, b, c});

cout << "最大值是:" << max_val << endl;
return 0;
}

1.3 三目运算符

用三目运算符可以把比较逻辑压缩到一行,适合追求简洁的场景:

#include<iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;

a = a > b ? a : b; //exp1 ? exp2 : exp3
a = a > c ? a : c; //三目操作符:表达式 exp1 成立,结果就是表达式 exp2 的值
// 若不成立结果就是 exp3 的值
cout << a << endl;
return 0;
}

2.  完整读取带空格的字符串 (getline)

在我们解题的时候,有的时候会遇见需要我们读取一整串字符串的情况。而如果创立一个数组,然后用 cin 或者是 scanf 去读取的方式,那就无法读取到带空格的字符串,比如说 I love C 这句话里面就含有两个空格,如果你直接用 scanf 去读取的话,或者是 cin 去读取的话,你只会读取到 I

就像上面这题,在读取字符串时必须用到 getline 这个函数

#include <iostream>
#include <string> // 必须包含此头文件
using namespace std;

int main() {
// 方案1:读取无空格的字符串(如 "hello")
string str1;
cout << "输入无空格字符串:";
cin >> str1; // 遇到空格/换行就停止读取
cout << "你输入的是:" << str1 << endl;

// 注意:cin读取后会残留换行符,需要清理缓冲区才能用getline
cin.ignore(numeric_limits<streamsize>::max(), '\\n');

// 方案2:读取带空格的整行字符串(如 "hello world")
string str2;
cout << "输入带空格的整行字符串:";
getline(cin, str2); // 读取整行,包括空格
cout << "你输入的是:" << str2 << endl;

return 0;
}

3. 向上取整和向下取整

3.1 巧妙运用整数除法

面对取整问题,我有两个解决方案,第一个就是通过巧妙的运用整数除法来实现这一操作,另外一种同样也是使用库函数,先介绍第一种

#include<iostream>
using namespace std;
int main()
{
int distance = 103;
int speed = 3;
int time = (distance + speed – 1) / speed; //结果为 35

cout << time << endl;
return 0;
}

这种做法的本质其实就是我通过加一个除数,使得我的结果必定会+1,然后再去 -1。避免因为我 distance 本身就能整除。但我仍然向上取了一位。意思就是说 distance 只要比能整除的情况大一点,也就是大一就能实现向上取整。

3.2 库函数

#include<iostream>
#include<cmath> //
using namespace std;
int main()
{
int distance = 103;
int speed = 3;
int time = ceil(distance * 1.0 / speed);
//这里记得 * 1.0 ,否则会因为执行的是整数除法而计算错误
cout << time << endl; //结果为 35

int time = floor(distance * 1.0 / speed);
cout << time << endl; //结果为 34
return 0;
}

我们先来看看这个英文单词,ceil 虽然本身是个动词,但它的名词的意思是天花板,floor 这个单词的意思是地板。很形象吧

大家应用这两个函数一定要注意两个点,一个就是要包含 cmath这个头文件。还有一个就是你传进去的参数一定要是一个浮点数。如果你要传一个表达式,切记它们执行的一定要是一个浮点数除法。像我这里就手动的给它乘了个1.0,使得它执行了浮点数除法。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【C++】 刷题一星期的小总结(包括求最大值,用数组储存包含空格的字符串、向上取整)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!