返回 课程
信奥AC之路-1级
0% 完成
0/0 步骤
-
第1课 开发环境与基础输出5 主题|小节
-
第2课 算术运算符7 主题|小节
-
第3课 printf与运算输出7 主题|小节
-
第4课 数的进制与拆位6 主题|小节
-
第5课 变量与基础运算17 主题|小节
-
第6课 常量与取整运算8 主题|小节
-
第7课 关系运算8 主题|小节
-
第8课 逻辑运算9 主题|小节
-
第9课 输入与计算进阶10 主题|小节
-
第10课 if语句及双分支语句8 主题|小节
-
第11课 if语句及双分支进阶11 主题|小节
-
第12课 三目运算9 主题|小节
-
第13课 多分支、多if和switch语句11 主题|小节
-
第14课 循环(基本输出)7 主题|小节
-
第15课 循环(While+If)8 主题|小节
-
第16课 循环(计数、求和、求乘积)10 主题|小节
-
第17课 循环进阶(While+)8 主题|小节
-
第18课 do-while及while其他用法8 主题|小节
-
第19课 For循环基础9 主题|小节
-
第20课 For循环进阶8 主题|小节
课 进展
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;
}
思考:
- 所有方法都需要将时、分、秒转换为秒数
- 上午和下午的区别在于是否需要加上12小时
- 方法一先计算基本秒数,然后根据条件调整
- 方法二和方法三分别处理上午和下午的情况
- 方法四使用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;
}
思考:
- 方法一先假设结果为7,然后在非零情况下更新
- 方法二使用提前返回处理特殊情况(星期日)
- 方法三使用if-else结构分别处理零和非零情况
- 方法四使用数学技巧,通过(a+b-1)%7+1将结果映射到1-7范围,避免了额外的条件判断
- 取模运算是处理周期性问题的常用方法