初莫M 发表于 2023-9-30 14:49:03

问一下代码错在哪了啊

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

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

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

输出格式:
对输入的每一行地球人时刻,输出对应的外星人时间,格式与输入相同。其中Day在 区间内,对应周日到周三;分钟数若不是整数,则向下取整。注意:由于周日的时间对外星人没有意义,所以直接输出地球人的时间即可。
我的代码是#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--;
        }
}

isdkz 发表于 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;
}

陶远航 发表于 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() 函数读入数据时,请务必检查控制台输入的数据格式是否正确。代码中对日期和时间进行了判断和转换,可以根据奇偶性计算外星人的时间,并按照题目要求输出。如果还有问题,请提供具体的错误信息或者代码运行结果,我们再一一排查。
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 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。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 问一下代码错在哪了啊