题目描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
输入:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
输出:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int y, days;
scanf("%d%d", &y, &days);
// 采用预处理,否则判断条件太多
int mday[2][12] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断闰年
int tag = 0;
if (y % 4 == 0 && y % 100 != 0) {
tag = 1;
}
else {
if (y % 400 == 0) {
tag = 1;
}
}
char month[2], day[2];
if (tag == 1) {
int i = 0;
while (days - mday[1][i] > 0) {
days -= mday[1][i];
i ++;
}
i += 1;
// 处理月份字符串
if (i > 9) {
month[0] = i / 10 + '0';
month[1] = i % 10 + '0';
}
else {
month[0] = '0';
month[1] = i + '0';
}
}
else {
int i = 0;
while (days - mday[0][i] > 0) {
days -= mday[0][i];
i ++;
}
i += 1;
if (i > 9) {
month[0] = i / 10 + '0';
month[1] = i % 10 + '0';
}
else {
month[0] = '0';
month[1] = i + '0';
}
}
if (days > 9) {
day[0] = days / 10 + '0';
day[1] = days % 10 + '0';
}
else {
day[0] = '0';
day[1] = days + '0';
}
// printf("%2s", month);
printf("%d-%.2s-%.2s", y, month, day);
system("pause");
return 0;
}
这里记录一下printf的部分用法
一、对于int整型输出一般格式为%d;当为%(x)d,当x大于当前int总位数时有效,表现为以下三种
- %xd, 左边补上空格,一共占据x列输出, 即左对齐
- %-xd,右边补上空格,一共占据x列,即右对齐
- %0xd, 左边补上0, 一共占据x列输出
二、对于float浮点数输出一般格式为%f,当为%(x)f,表现为以下四种
- %.xf,保留x位小数,如果位数大于当前输出,右边补上0
- %x.yf 保留y为小数,同4,一共占据x列,列数大于输出位数,左边补上空格,即右对齐,x小于当前位数或者y大于当前小数位数时,不表现出效果
- %0x.yf 效果同5,不同之处左边补上0
- %-x.yf 与 %-0x.yf 均表现为右边补上空格
三、对于string字符串输出一般格式为%s,当为%(x)s,表现为保留x位字符串即从左往右截取字符串,x大于字符串位数时无效