1、有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
**思路:**因为输入的是整体,所以通过time%100将小时与分钟分别取出。特别需要注意的是当前的分钟数加上流逝时间%60后的分钟数,如果仍然>60,则小时还需加1。此外,还有可能是计算之前的时间,所以输入的流逝时间是负数,还需取反。
#include
int main(){
int N, M;
int hour = 0;
int minute = 0;
int S_hour = 0;
int S_minute = 0;
scanf("%d%d", &N, &M);
minute = N % 100;
hour = N / 100;
if(M >=0){
S_hour = M / 60; //取出流逝时间为几个小时
S_minute = M % 60;//流逝时间取小时整后的分钟
if(S_minute + minute >= 60){//流逝时间取整后的分钟数,与当前时间的分钟数之和>60,则小时需加1
printf("%d\n", (hour + S_hour+1)*100 + (minute+S_minute)%60);
}else{
printf("%d\n", (hour + S_hour)*100 + (minute+S_minute));
}
}else{
M = -M; //算当前时间的之前时间
S_hour = M / 60;
S_minute = M % 60;
if(minute - S_minute >=0){
if(hour - S_hour != 0){
printf("%d\n", (hour - S_hour)*100 + (minute-S_minute));
}else{
printf("0%d\n", (minute-S_minute));
}
}else {
if(hour - S_hour - 1 != 0){
printf("%d\n", (hour - S_hour - 1)*100 + (60-S_minute + minute));
}else{
printf("0%d\n", (60 + minute - S_minute));
}
}
}
return 0;
}
2、回顾了一下寒假写的二叉树相关代码。
2.1二叉树结点结构体
typedef struct BINARYTREE{
char data; //数据域
struct BINARYTREE* lchild;//左孩子
struct BINARYTREE* rchild;//右孩子
}BinaryTree;
2.2动态创建二叉树(通过先序序列创建二叉树)
//先序创建二叉树
BinaryTree* CreateBinaryTree(){
char ch;
scanf("%c", &ch);//输入结点值
BinaryTree* node;//定义结点
if(ch == '#'){//#代表空结点
node = NULL;
}else{
node = (BinaryTree*)malloc(sizeof(BinaryTree));
node->data = ch;
node->lchild = CreateBinaryTree();
node-> rchild = CreateBinaryTree();
}
return node;//返回根结点
}
2.3先序遍历二叉树
void PreOrder(BinaryTree* root){
if(root == NULL){
return;
}
printf("%c ", root->data);//打印结点值
PreOrder(root->lchild); //递归遍历左子树
PreOrder(root->rchild); //递归遍历右子树
}
2.4中序遍历二叉树
void InOrder(BinaryTree* root){
if(root == NULL){
return;
}
InOrder(root->lchild);//打印结点值
printf("%c ", root->data);//打印结点值
InOrder(root->rchild); //递归遍历右子树
}
2.5后续遍历二叉树
void PostOrder(BinaryTree* root){
if(root == NULL){
return;
}
PostOrder(root->lchild);//打印结点值
PostOrder(root->rchild); //递归遍历右子树
printf("%c ", root->data);//打印结点值
}
2.6完整代码
#include
#include
//二叉树结点结构体
typedef struct BINARYTREE{
char data; //数据域
struct BINARYTREE* lchild;//左孩子
struct BINARYTREE* rchild;//右孩子
}BinaryTree;
//先序遍历二叉树
void PreOrder(BinaryTree* root){
if(root == NULL){
return;
}
printf("%c ", root->data);//打印结点值
PreOrder(root->lchild); //递归遍历左子树
PreOrder(root->rchild); //递归遍历右子树
}
//中续遍历二叉树
void InOrder(BinaryTree* root){
if(root == NULL){
return;
}
InOrder(root->lchild);//打印结点值
printf("%c ", root->data);//打印结点值
InOrder(root->rchild); //递归遍历右子树
}
//后续遍历二叉树
void PostOrder(BinaryTree* root){
if(root == NULL){
return;
}
PostOrder(root->lchild);//打印结点值
PostOrder(root->rchild); //递归遍历右子树
printf("%c ", root->data);//打印结点值
}
//先序创建二叉树
BinaryTree* CreateBinaryTree(){
char ch;
scanf("%c", &ch);//输入结点值
BinaryTree* node;//定义结点
if(ch == '#'){//#代表空结点
node = NULL;
}else{
node = (BinaryTree*)malloc(sizeof(BinaryTree));
node->data = ch;
node->lchild = CreateBinaryTree();
node-> rchild = CreateBinaryTree();
}
return node;//返回根结点
}
int main(){
BinaryTree* root = CreateBinaryTree();
printf("Create success!\n");
printf("PreOrder: ");
PreOrder(root);
printf("\n");
printf("InOrder: ");
InOrder(root);
printf("\n");
printf("PostOrder: ");
PostOrder(root);
return 0;
}
输入格式与二叉树:
遍历结果:
**总结:**今天就写了几道数学题,然后就选了一道逻辑较复杂的。然后,今天写代码的时间少,就回顾了一下寒假写的二叉树。当时是跟着视频敲,也是比较深入的理解,今天自己写的时候,90%多都能写出,只是在动态创建二叉树的一些细节做的不好(比如忘了需要返回创建的根节点,所以创建二叉树的函数也应该是结构体定义的类型),不过通过今天的再次复写,记忆与理解都非常深刻了。最后,二叉树的3种遍历都相对简单,通过递归遍历即可,但仍需注意对根节点的判空操作。