鱼C论坛

 找回密码
 立即注册
查看: 1160|回复: 3

[已解决]问一下代码错在哪了啊

[复制链接]
发表于 2023-9-30 14:49:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目是
地球上的一天是 24 小时。但地球上还有一些精力和勤奋度都远超一般人的大神级人物,他们的“一天”是以 48 小时为周期运转的,这种人被人们尊称为“外星人”。比如普通人的周一早 8:30 是外星人的周一早 4:15;普通人的周二早 9:21 是外星人的周一下午 4:40 —— 对外星人而言,一周的工作时间只有三天(即普通人的周一至周六),周日他们会蒙头大睡恢复体力,时间对他们是没有意义的。

在外星人眼里,地球人的时钟对他们而言实在是太不方便了。本题就请你为外星人们实现一款专用时钟。

输入格式:
输入在一行中给出一个不超过 10 的正整数 N,随后 N 行,每行给出一个地球人的时刻,格式为:Day hh:mm,其中Day是 [0,6] 区间内的整数,顺序代表周日至周六;hh是 24 小时制的小时数,是 [0,23] 区间内的整数;mm是分钟数,是 [0,59] 区间内的整数。

输出格式:
对输入的每一行地球人时刻,输出对应的外星人时间,格式与输入相同。其中Day在 [0,3] 区间内,对应周日到周三;分钟数若不是整数,则向下取整。注意:由于周日的时间对外星人没有意义,所以直接输出地球人的时间即可。
我的代码是#include<stdio.h>
int main()
{
        int n;
        scanf("%d",&n);
        int day,h,m;
        while(n>0)
        {
                scanf("%d %d:%d",&day,&h,&m);
                if(day==0) printf("%d %02d:%02d\n",day,h,m);
        else{
                if(day%2!=0)
                {
                        h=h/2;
                        if(h%2!=0) m=(m+60)/2;
                        if(h%2==0) m=m/2;
                        printf("%d %02d:%02d\n",day,h,m);
                }
                if(day%2==0)
                {        h=h/2;
                        if(h%2!=0) m=(m+60)/2;
                        if(h%2==0) m=m/2;
                        printf("%d %02d:%02d\n",day-1,h+12,m+30);       
                }
        }
                n--;
        }
}
最佳答案
2023-9-30 14:50:02
分析:

根据题目中的描述,我们可以将外星人的时间转换为 24 小时制,从而进行计算,具体地,将普通人的一个小时拆分为两个“外星人小时”,即将普通人的 1:00 转换成外星人的 2:00,将普通人的 2:30 转换成外星人的 3:15。

因此,我们可以先读入一个地球人的时刻,将其转换为分钟数,再将其转换为外星人的分钟数,最后再将其转换回地球人的时刻输出即可。

需要注意的是,周日的时间对外星人来说没有意义,因此可以直接输出地球人的时间。

代码实现:
++#include <stdio.h>int main(){    int n;    scanf("%d", &n);    while (n--) {        int day, h, m;        scanf("%d %d:%d", &day, &h, &m);        int earth_time = day * 1440 + h * 60 + m; // 计算地球人的时间(单位为分钟)        int alien_time = (earth_time / 2) % (4 * 1440); // 计算外星人的时间(单位为分钟)        // 如果是周日,则直接输出地球人的时间        if (day == 0) {            printf("%d %02d:%02d\n", day, h, m);        } else {            int alien_day = alien_time / 1440; // 外星人的天数            int alien_hour = alien_time % 1440 / 60; // 外星人的小时数            int alien_minute = alien_time % 60; // 外星人的分钟数            // 如果是奇数天,则直接输出外星人的时间            if (day % 2 == 1) {                printf("%d %02d:%02d\n", alien_day, alien_hour, alien_minute);            } else { // 如果是偶数天,则需要特殊处理                alien_day--;                alien_hour += 12;                if (alien_minute >= 30) {                    alien_hour++;                    alien_minute -= 30;                } else {                    alien_minute += 30;                }                printf("%d %02d:%02d\n", alien_day, alien_hour, alien_minute);            }        }    }    return 0;}
注意,上述代码中的 1440 是一天的分钟数,等价于 24 * 60

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 14:49:17 | 显示全部楼层
这段代码的问题在于,对于每个输入的时间,都只判断了它是不是周日,而没有对其他日期进行处理。此外,当输入的时间是周日时,输出的时间也应该是周日,但是代码中只有对周日进行了输出,而没有对其他日期进行输出。因此,需要对所有日期进行处理,以及在周日时也输出周日的时间。具体来说,可以先将输入的时间转化为分钟数,然后对于每个日期,将其转化为外星人的时间,最后再将外星人的时间转化为小时和分钟输出。以下是修改后的代码:
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    while (n--) {
        int day, h, m;
        scanf("%d %d:%d", &day, &h, &m);
        int minutes = day * 24 * 60 + h * 60 + m; // 将时间转化为分钟数
        if (day == 0) { // 周日
            printf("%d %02d:%02d\n", day, h, m);
        } else {
            int alien_minutes = (day / 2) * 48 * 60 + ((day % 2) ? (h + 24) : h) * 60 + m / 2; // 转化为外星人的分钟数
            int alien_day = alien_minutes / (48 * 60); // 转化为外星人的日期
            int alien_hour = (alien_minutes % (48 * 60)) / 60; // 转化为外星人的小时数
            int alien_minute = alien_minutes % 60; // 转化为外星人的分钟数
            printf("%d %02d:%02d\n", alien_day, alien_hour, alien_minute);
        }
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 14:49:38 | 显示全部楼层
这段代码的问题是格式不够规范,其中有很多空格和不可见字符,导致代码无法正常运行。请把代码复制到一个新的编辑器中,删除所有的空格和不可见字符,再重新排版一下。

以下是格式化后的代码:
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int day, h, m;
    while (n > 0) {
        scanf("%d %d:%d", &day, &h, &m);
        if (day == 0)
            printf("%d %02d:%02d\n", day, h, m);
        else {
            if (day % 2 != 0) {
                h = h / 2;
                if (h % 2 != 0)
                    m = (m + 60) / 2;
                if (h % 2 == 0)
                    m = m / 2;
                printf("%d %02d:%02d\n", day, h, m);
            }
            if (day % 2 == 0) {
                h = h / 2;
                if (h % 2 != 0)
                    m = (m + 60) / 2;
                if (h % 2 == 0)
                    m = m / 2;
                printf("%d %02d:%02d\n", day - 1, h + 12, m + 30);
            }
        }
        n--;
    }
    return 0;
}

在使用 scanf() 函数读入数据时,请务必检查控制台输入的数据格式是否正确。代码中对日期和时间进行了判断和转换,可以根据奇偶性计算外星人的时间,并按照题目要求输出。如果还有问题,请提供具体的错误信息或者代码运行结果,我们再一一排查。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 14:50:02 | 显示全部楼层    本楼为最佳答案   
分析:

根据题目中的描述,我们可以将外星人的时间转换为 24 小时制,从而进行计算,具体地,将普通人的一个小时拆分为两个“外星人小时”,即将普通人的 1:00 转换成外星人的 2:00,将普通人的 2:30 转换成外星人的 3:15。

因此,我们可以先读入一个地球人的时刻,将其转换为分钟数,再将其转换为外星人的分钟数,最后再将其转换回地球人的时刻输出即可。

需要注意的是,周日的时间对外星人来说没有意义,因此可以直接输出地球人的时间。

代码实现:
++#include <stdio.h>int main(){    int n;    scanf("%d", &n);    while (n--) {        int day, h, m;        scanf("%d %d:%d", &day, &h, &m);        int earth_time = day * 1440 + h * 60 + m; // 计算地球人的时间(单位为分钟)        int alien_time = (earth_time / 2) % (4 * 1440); // 计算外星人的时间(单位为分钟)        // 如果是周日,则直接输出地球人的时间        if (day == 0) {            printf("%d %02d:%02d\n", day, h, m);        } else {            int alien_day = alien_time / 1440; // 外星人的天数            int alien_hour = alien_time % 1440 / 60; // 外星人的小时数            int alien_minute = alien_time % 60; // 外星人的分钟数            // 如果是奇数天,则直接输出外星人的时间            if (day % 2 == 1) {                printf("%d %02d:%02d\n", alien_day, alien_hour, alien_minute);            } else { // 如果是偶数天,则需要特殊处理                alien_day--;                alien_hour += 12;                if (alien_minute >= 30) {                    alien_hour++;                    alien_minute -= 30;                } else {                    alien_minute += 30;                }                printf("%d %02d:%02d\n", alien_day, alien_hour, alien_minute);            }        }    }    return 0;}
注意,上述代码中的 1440 是一天的分钟数,等价于 24 * 60

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 01:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表