分数 10
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照hh:mm
的格式给出当前时间。其中hh
是小时,在00到23之间;mm
是分钟,在00到59之间。
输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang
。如果不是敲钟期,则输出:
Only hh:mm. Too early to Dang.
其中hh:mm
是输入的时间。
输入样例1:
19:05
输出样例1:
DangDangDangDangDangDangDangDang
输入样例2:
07:05
输出样例2:
Only 07:05. Too early to Dang.
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
我的答案:
首先,为了解决这个问题,我们需要确定两个条件:
- 当前的时间是否在笨钟的敲钟时间范围内(即12:01至23:59)。
- 如果在范围内,我们需要确定笨钟敲几下。
接下来是C语言和C++的实现。
C语言实现:
#include <stdio.h>
int main() {
int hh, mm;
scanf("%d:%d", &hh, &mm);
if (hh < 12 || (hh == 12 && mm == 0)) {
printf("Only %02d:%02d. Too early to Dang.\n", hh, mm);
} else {
if (mm > 0) hh++; // 如果分钟大于0,则钟声数增加1
for (int i = 12; i < hh; i++) {
printf("Dang");
}
}
return 0;
}
C++:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int hh, mm;
char ch;
cin >> hh >> ch >> mm;
if (hh < 12 || (hh == 12 && mm == 0)) {
cout << "Only " << setw(2) << setfill('0') << hh << ":" << setw(2) << setfill('0') << mm << ". Too early to Dang." << endl;
} else {
if (mm > 0) hh++; // 如果分钟大于0,则钟声数增加1
for (int i = 12; i < hh; i++) {
cout << "Dang";
}
}
return 0;
}
总结:
从这道题目“大笨钟”中,我们可以学习到以下几点:
1. **字符串处理**:通过对输入字符串的处理,我们可以提取和转换时间数据。
2. **条件逻辑**:根据题目的描述,我们需要判断当前时间是否在特定的时间范围内,以决定是敲钟还是输出一个特定的消息。
3. **循环**:题目要求输出“Dang”多次,这需要用到循环。
4. **格式化输出**:题目中的某些输出格式要求可以使用标准库中的格式化工具,如`setw`和`setfill`,来进行处理。虽然这道题目的解答中并没有使用到,但知道这些工具的存在和如何使用它们是有帮助的。
5. **问题分解**:解决这个问题需要将其分解为几个较小的子问题,如:
- 如何从字符串中解析出小时和分钟?
- 如何判断当前时间是否在敲钟的时间范围内?
- 如何决定敲多少下钟?
6. **实际应用**:虽然这是一个编程练习题,但它模仿了现实生活中的一个场景。通过这样的题目,我们可以了解如何使用编程来模拟或解决实际生活中的问题。
7. **细节注意**:例如,要确保正确地处理分钟数,因为即使已经超过了某个整点,钟声的次数仍然会增加。
总之,这道题目提供了对字符串处理、条件逻辑和循环的实践,同时也展示了如何将现实生活的场景转化为编程问题。
学到了什么新东西?
`#include <iomanip>` 是 C++ 标准库的一个头文件,它提供了一系列的输入/输出操作符,用于格式化I/O操作。使用这个头文件,你可以更方便地控制输出的格式,如设置宽度、填充、精度、数字的基数格式等。
这里是该头文件中一些常用的操作符和它们的描述:
1. **setw(int)**:设置输出字段宽度。
```cpp
cout << setw(5) << 123; // 输出:" 123"
```
2. **setfill(char)**:设置填充字符。
```cpp
cout << setw(5) << setfill('0') << 123; // 输出:"00123"
```
3. **setprecision(int)**:设置浮点数的输出精度。
```cpp
cout << setprecision(3) << 3.14159; // 输出:"3.14"
```
4. **fixed**:使浮点数以固定小数位数形式输出。
```cpp
cout << fixed << setprecision(3) << 3.14159; // 输出:"3.142"
```
5. **showpoint**:总是显示小数点。
6. **showpos**:正数前面显示`+`号。
7. **left/right/internal**:控制输出字段中的对齐方式。
在你给出的问题中,`setw`和`setfill`被用于确保小时和分钟总是以两个数字的形式输出,即使它们的值小于10。