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
 
  1. 负数处理__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;
}


 

更多推荐