返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 11, 主题|小节 4
进行中

11.3 时间计算问题

2025年9月22日
课 进展
0% 完成

11.3.1 一天中的时间计算

“时间计算是编程中的常见任务,”我解释道,”它通常涉及到单位转换和条件判断。”

实验四:当天的第几秒

题目描述:输入一行,包含三个整数和一个字符。三个整数分别表示时刻的时、分、秒;字符有两种取值,大写字母’A’表示上午,大写字母’P’表示下午。输出一行,包含一个整数,表示输入时刻是当天的第几秒。

样例输入

10 30 0 A

样例输出

37800

样例输入

3 45 30 P

样例输出

56730

思路分析: 需要将时、分、秒转换为秒数,并根据上午(A)或下午(P)对小时进行调整。上午的时间直接计算,下午的时间需要加上12小时。在第一个样例中,上午10:30:00转换为秒数为10×3600+30×60+0=37800秒。在第二个样例中,下午3:45:30转换为秒数为(3+12)×3600+45×60+30=56730秒。

代码实现

// 方法一:使用变量存储总秒数
#include <iostream>
using namespace std;

int main() {
    int h, m, s;
    char ch;
    cin >> h >> m >> s >> ch;
    int sum = h * 60 * 60 + m * 60 + s;    // 计算总秒数
    if(ch == 'P') {                        // 如果是下午
        sum += 12 * 60 * 60;               // 加上12小时的秒数
    }
    cout << sum;
    return 0;
}

// 方法二:提前返回
#include <iostream>
using namespace std;

int main() {
    int h, m, s;
    char ch;
    cin >> h >> m >> s >> ch;
    if(ch == 'A') {                        // 如果是上午
        cout << h * 3600 + m * 60 + s;     // 输出总秒数
        return 0;                          // 结束程序
    }
    cout << (h + 12) * 3600 + m * 60 + s;  // 如果是下午,输出调整后的总秒数
    return 0;
}

// 方法三:使用两个独立的if语句
#include <iostream>
using namespace std;

int main() {
    int h, m, s;
    char ch;
    cin >> h >> m >> s >> ch;
    if(ch == 'A') {                        // 如果是上午
        cout << h * 3600 + m * 60 + s;     // 输出总秒数
    }
    if(ch == 'P') {                        // 如果是下午
        cout << (h + 12) * 3600 + m * 60 + s;  // 输出调整后的总秒数
    }
    return 0;
}

// 方法四:使用if-else结构
#include <iostream>
using namespace std;

int main() {
    int h, m, s;
    char ch;
    cin >> h >> m >> s >> ch;
    if(ch == 'A') {                        // 如果是上午
        cout << h * 3600 + m * 60 + s;     // 输出总秒数
    } else {                               // 否则(是下午)
        cout << (h + 12) * 3600 + m * 60 + s;  // 输出调整后的总秒数
    }
    return 0;
}

思考

  1. 所有方法都需要将时、分、秒转换为秒数
  2. 上午和下午的区别在于是否需要加上12小时
  3. 方法一先计算基本秒数,然后根据条件调整
  4. 方法二和方法三分别处理上午和下午的情况
  5. 方法四使用if-else结构确保只有一个分支被执行

11.3.2 周期性时间问题

“周期性时间问题通常涉及到取模运算,”我继续说道,”让我们看一个关于星期几的问题。”

实验五:星期几

题目描述:今天是星期a,过b天后是星期几?

样例输入

3 4

样例输出

7

样例输入

6 9

样例输出

1

思路分析: 星期是以7天为一个周期循环的。因此,可以通过(a+b)%7来计算过b天后的星期几,注意处理0的特殊情况(通常表示星期日或星期7)。在第一个样例中,今天是星期3,过4天后是星期(3+4)%7=7。在第二个样例中,今天是星期6,过9天后是星期(6+9)%7=15%7=1。

代码实现

// 方法一:处理结果为0的特殊情况
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int x = 7;                       // 默认结果为7(星期日)
    int c = a + b;                   // 计算总天数
    if(c % 7) {                      // 如果对7取模不为0
        x = c % 7;                   // 更新结果为取模结果
    }
    cout << x;
    return 0;
}

// 方法二:提前返回
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    if((a + b) % 7 == 0) {           // 如果对7取模为0
        cout << 7;                   // 输出7(星期日)
        return 0;                    // 结束程序
    }
    cout << (a + b) % 7;             // 输出取模结果
    return 0;
}

// 方法三:使用if-else结构
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    a = a + b;                       // 计算总天数
    if(a % 7 != 0) {                 // 如果对7取模不为0
        cout << a % 7;               // 输出取模结果
    } else {                         // 否则(取模为0)
        cout << 7;                   // 输出7(星期日)
    }
    return 0;
}

// 方法四:数学技巧
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    cout << (a + b - 1) % 7 + 1;     // 使用(a+b-1)%7+1计算星期几
    return 0;
}

思考

  1. 方法一先假设结果为7,然后在非零情况下更新
  2. 方法二使用提前返回处理特殊情况(星期日)
  3. 方法三使用if-else结构分别处理零和非零情况
  4. 方法四使用数学技巧,通过(a+b-1)%7+1将结果映射到1-7范围,避免了额外的条件判断
  5. 取模运算是处理周期性问题的常用方法