王道机试指南刷题笔记-机试准备

2.7 打印日期(华中科技大学复试上机题)

在线提交网址

  1. 我的思路
    ① 是昨天求总天数问题的逆问题,求总天数是累加,这里应该是逐个相减。同样需要预处理和判断闰平年的函数。
    ② 一开始写了个for循环逐次相减,循环条件是 i<13 && 天数>0,自己测试的时候发现最后输出结果的月份无一例外全是12 ,也没找到原因,最后发现循环条件有问题。
    ③ 修改之后的循环条件:天数-月份天数>0,大于0意味着不是该月,循环继续。小于等于0说明就是该月。循环内的语句:n-=day[row][i] ,跳出循环时把i赋值给月份,把n赋值给天数。这样得到的结果是正确的。
    ④ 格式问题:年份是四位数没问题,主要是月和日的输出,如果小于10则前面补0,也即控制格式输出,这里完全不会,直接看答案。

  2. 查缺补漏
    ① 解答里给出了常用的输出格式:这里控制月和日前的补0,采用第二种格式控制输出
    | %2d |输出场宽为2的整数,超过2位按实际数据输出,不够2位右对齐输出 |
    |%02d|输出场宽为2的整数,超过2位按实际数据输出,不够2位前置补0|
    |%5.2f|输出场宽为5的浮点数,小数点后有2位,不够5位右对齐输出|
    ② 解答里采用的是while循环,恍然大悟,怪不得自己写的时候for怎么都不得劲儿。

  3. 源代码

#include <stdio.h>
#include <stdbool.h>
 
// 预处理
int day[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
 
// 判断是否是闰年
bool isLeapYear(int y){
    return ( y%400==0 || ((y%4==0)&&y%100!=0) );
}

int main() {
    int m,n;
    while (scanf("%d %d", &m, &n) != EOF) { 
        int M,D;
        int row = isLeapYear(m);  // 判断是否闰年
        int i=0;
        // 这里用while循环比较好,天数>该月份天数时循环
        for ( i = 1 ; ( n - day[row][i] ) > 0 ; i++ ) {
            n -= day[row][i];
        }
        M = i;  // 获取月
        D = n;  // 获取日
        // 控制月和日的输出格式
        printf("%d-%02d-%02d\n",m,M,D);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值