c++小白在洛谷学到的东西——week 2
1.洛谷p707题
本小白在做这道题时,半天没有弄懂,隔一天的逻辑,特此记录一下这个题;
题目:
题目描述
学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。
学校要求必须在上午 8:00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。
注意,yyy 只能在每分钟的第 0 秒时出发。
输入格式
一行两个正整数 s,v,分别代表路程和速度。
输出格式
输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double s,v;
cin>>s>>v;
int t;
t=ceil(s/v)+10;//这里也是本小白学到的向上取整函数,里面要传入的数必须是浮点型
int n=480-t;
if(n<0) n+=1440;
int hh=n/60,mm=n%60;//就是这两行,我的逻辑是算出需要的时间,然后用八点(480min)减去花费的时间,把它分成今天和昨天去解决问题
if(hh<10)
{
if(mm<10) cout<<'0'<<hh<<":0"<<mm;
else cout<<'0'<<hh<<':'<<mm;
}
else
{
if(mm<10) cout<<hh<<":0"<<mm;
else cout<<hh<<':'<<mm;
}
return 0;
}
int n=480-t;
if(n<0) n+=1440
这两行是解决这道题目的关键!我最开始是吧昨天的时间取绝对值进行处理,但是这样是不行的,当消耗时间是500分钟时,算的是-20;直接取绝对值,就会把原来的23:40变为00:20;显然这样是不对的,我们只需要加上一天的时间这样的处理就会得到正确答案;即if(n<0) n+=1440
在这道题目中,我学会了ceil函数,即向上取整函数;里面传入的必须是浮点型!
2.控制输出的小数位数
在 C++ 中,用 cout 输出 double 类型的数字会自动保留六位有效数字,然后我们就可以轻松写出代码啦,但是有的时候我们需要控制小数点后的输出位数;有两套体系进行输出;
1.cout
cout默认6位有效数字,不是小数点后保留6位数字!会自动去掉末尾0,如果想要保留几位数字需要借用函数fixed 和 setprecision
fixed 和 setprecision 的用法
fixed 和 setprecision 是 C++ 中用于控制浮点数输出格式的两个重要工具,通常与 <iomanip> 头文件一起使用。以下是它们的详细用法和区别:
fixed
fixed 是浮点数输出的格式标志,用于强制以固定小数格式显示浮点数。启用后,浮点数会以小数形式显示,而非科学计数法。
setprecision
setprecision 用于设置浮点数输出的精度(即有效数字或小数位数)。具体行为取决于是否启用了 fixed。
特点:
- 未启用
fixed时,setprecision(n)控制总有效数字(包括整数部分)。 - 启用
fixed后,setprecision(n)控制小数点后的位数。
它们两个连用可以控制输出的小数位数,且写一遍后面的输出都会生效,代码如下:
double a = 3.1415926, b = 11.4514;
cout << fixed << setprecision(3) << a;
cout << " " << b;
//输出为: 3.142 11.451
当 setprecision 单独使用时,就可以控制输出的有效数字位数,代码如下:
double a = 3.1415926, b = 11.4514;
cout << setprecision(3) << a;
cout << " " << b;
//输出为: 3.14 11.5
2.printf
用%nlf n是你想保留的位数 如果你输入的n<数字本身的位数,他会还会往后输出 double 类型默认小数点后保留6位 例如
double a=3.1415926;
printf("%3f",a);//他会输出3.141593
而当你不输入n时,如果他小数点后不够6位,会自动补0
double b = 11.4514;
printf("%f",b);//11.451400
%.nlf或者%.nf 都表示你想在小数点后保留几位数字
double b = 11.4514;
printf("%.3f",b);//11.452
3.注:以上说的都满足4舍5入
3.公约数函数__gcd
__gcd 函数简介
__gcd 是 C++ 标准库中的一个内置函数,用于计算两个整数的最大公约数(Greatest Common Divisor, GCD)。它通常包含在 <algorithm> 或 <numeric> 头文件中(不同编译器可能有所不同)。
int __gcd(int a, int b);
- 参数:两个整数
a和b。 - 返回值:
a和b的最大公约数。
使用示例
#include <iostream>
#include <algorithm> // 或 <numeric>
using namespace std;
int main() {
int a = 12, b = 18;
int gcd = __gcd(a, b);
cout << "GCD of " << a << " and " << b << " is " << gcd << std::endl;
return 0;
}
输出:
GCD of 12 and 18 is 6
- 负数处理:
__gcd和std::gcd会返回非负结果,即使输入为负数。
4.字符与数字的相互转换
在一些场景中,我们需要把一个字符转化为数字
字母序号转换:
1.-'@'
@的ASCII值是64;而A是65;减去@正好相当于字母序号,后面的字母也是一个原理
char c;
cin>>c;//输入想输入的字母
cout<<c-'@'
注:小写字母比大写字母的ASCII值大32,如A是65,a是97
2.-'A'+1
'A' - 'A' + 1 = 0 + 1 = 1
'B' - 'A' + 1 = 1 + 1 = 2
...
'Z' - 'A' + 1 = 25 + 1 = 26
ASCII码转换
这个比较简单,我们只需要将他强制类型转换为int类型即可
char c='a';
cout<<(int)c;
字符数字与整数值的相互转换
字符数字转换为正数值:-‘0’
正数值转换为字符数字:+‘0’
#include <iostream>
using namespace std;
int main() {
// 字符 '5' → 整数 5
char c = '5';
int num = c - '0'; // 5
// 整数 5 → 字符 '5'
int n = 5;
char ch = n + '0'; // '5'
cout << "字符 '5' 转整数: " << num << endl;
cout << "整数 5 转字符: " << ch << endl;
}
更多推荐
所有评论(0)