每日刷题(二十四)
蓝桥杯第八届C语言B组省赛习题
习题G:日期问题
这个题难度还是不大的,大家可能卡就在如何解析输入数据,这里我是将输入的数据输入一个数组,然后再将数组解剖成三块分给其他三个变量,这个题还考查了闰年以及月份所对应的天数的计算。
详细C代码如下
#include<stdio.h>
int leapyear(int year)
{
if(year % 4 == 0 && year % 100 != 0)
return 1;
else if(year % 400 == 0)
return 1;
else
return 0;
}
int days(int month, int year)
{
if(month == 2)
if(leapyear(year))
return 29;
else
return 28;
else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
return 31;
else
return 30;
}
int main()
{
char string[8];
scanf("%s",string);
int a, b, c;
a = (string[0] - '0') * 10 + (string[1] - '0');
b = (string[3] - '0') * 10 + (string[4] - '0');
c = (string[6] - '0') * 10 + (string[7] - '0');
//可能性一:年/月/日
if(a >= 60) //先处理年
a += 1900;
else
a += 2000;
if(b <= 12 && b >= 1)
if(c <= days(b,a) && c >= 1)
{
printf("%d-%02d-%02d\n",a, b, c);
}
a = (string[0] - '0') * 10 + (string[1] - '0');
b = (string[3] - '0') * 10 + (string[4] - '0');
c = (string[6] - '0') * 10 + (string[7] - '0');
//可能性二:月/日/年
if(c >= 60)
c += 1900;
else
c += 2000;
if(a <= 12 && a >= 1)
if(b <= days(a,c) && b >= 1)
{
printf("%d-%02d-%02d\n",c, a, b);
}
a = (string[0] - '0') * 10 + (string[1] - '0');
b = (string[3] - '0') * 10 + (string[4] - '0');
c = (string[6] - '0') * 10 + (string[7] - '0');
//可能性三:日/月/年
if(c >= 60)
c += 1900;
else
c += 2000;
if(b <= 12 && b >= 1)
if(a <= days(b, c) && a >= 1)
printf("%d-%02d-%02d\n",c, b, a);
return 0;
}
经过验证,没问题
很感谢评论区的友人指正,上面的代码不是很严谨,确实怪我没考虑到那么多方面,这里赔个不是,以下为2021-4-12-15:33修正的代码
为什么有问题呢,因为我上面的代码很可能会输出两三个一样的年份,当输入的都满足那三种情况时
C代码如下(全网最易懂且代码量最大的代码)
我知道也可以C++做,可以减少一些代码量,亦或是换种方法,但是我还是想把这种思路的做法画个句号
#include<stdio.h>
int leapyear(int year)
{
if(year % 4 == 0 && year % 100 != 0)
return 1;
else if(year % 400 == 0)
return 1;
else
return 0;
}
int days(int month, int year)
{
if(month == 2)
if(leapyear(year))
return 29;
else
return 28;
else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
return 31;
else
return 30;
}
int main()
{
char string[8];
scanf("%s",string);
int a, b, c;
//flag为条件是否满足标志位
int flag[4] = {0};
a = (string[0] - '0') * 10 + (string[1] - '0');
b = (string[3] - '0') * 10 + (string[4] - '0');
c = (string[6] - '0') * 10 + (string[7] - '0');
int d, e, f;
int g, h, i;
//可能性一:年/月/日
if(a >= 60) //先处理年
a += 1900;
else
a += 2000;
if(b <= 12 && b >= 1)
if(c <= days(b,a) && c >= 1)
{
flag[1] = 1;
}
d = (string[0] - '0') * 10 + (string[1] - '0');
e = (string[3] - '0') * 10 + (string[4] - '0');
f = (string[6] - '0') * 10 + (string[7] - '0');
//可能性二:月/日/年
if(f >= 60)
f += 1900;
else
f += 2000;
if(d <= 12 && d >= 1)
if(e <= days(d,f) && e >= 1)
{
flag[2] = 1;
}
g = (string[0] - '0') * 10 + (string[1] - '0');
h = (string[3] - '0') * 10 + (string[4] - '0');
i = (string[6] - '0') * 10 + (string[7] - '0');
//可能性三:日/月/年
if(i >= 60)
i += 1900;
else
i += 2000;
if(h <= 12 && h >= 1)
if(g <= days(h, i) && g >= 1)
flag[3] = 1;
int sort[4][4];
sort[1][1] = a;
sort[1][2] = b;
sort[1][3] = c;
sort[2][1] = f;
sort[2][2] = d;
sort[2][3] = e;
sort[3][1] = i;
sort[3][2] = h;
sort[3][3] = g;
int v1 = sort[1][1] * 10000 + sort[1][2] * 100 + sort[1][3];
int v2 = sort[2][1] * 10000 + sort[2][2] * 100 + sort[2][3];
int v3 = sort[3][1] * 10000 + sort[3][2] * 100 + sort[3][3];
if(v1 == v2 && v1 == v3)
{
flag[2] = 0;
flag[3] = 0;
}
else if(v1 == v2)
{
flag[1] = 0;
}
else if(v1 == v3)
{
flag[1] = 0;
}
else if(v2 == v3)
{
flag[2] = 0;
}
int wan = 0;
int digit[4] = {0};
int neww[4];
int chance;
int cnt = 0;
int cnn = 1;
for(chance = 1; chance <= 3; chance++)
{
if(flag[chance])
{
neww[cnn++] = sort[chance][1] * 10000 + sort[chance][2] * 100 + sort[chance][3];
cnt++;
}
}
if(cnt == 0)
{
return 0;
}
else if(cnt == 1)
{
printf("%d-%02d-%02d\n",neww[cnn - 1] / 10000, neww[cnn - 1] % 10000 / 100, neww[cnn - 1] % 100);
}
else if(cnt == 2)
{
if(neww[1] > neww[2])
{
int temp = neww[1];
neww[1] = neww[2];
neww[2] = temp;
}
printf("%d-%02d-%02d\n",neww[1] / 10000, neww[1] % 10000 / 100, neww[1] % 100);
printf("%d-%02d-%02d\n",neww[2] / 10000, neww[2] % 10000 / 100, neww[2] % 100);
}
else if(cnt == 3)
{
if(neww[1] > neww[2])
{
int temp = neww[1];
neww[1] = neww[2];
neww[2] = temp;
}
if(neww[1] > neww[3])
{
int temp = neww[1];
neww[1] = neww[3];
neww[3] = temp;
}
if(neww[2] > neww[3])
{
int temp = neww[2];
neww[2] = neww[3];
neww[3] = temp;
}
printf("%d-%02d-%02d\n",neww[1] / 10000, neww[1] % 10000 / 100, neww[1] % 100);
printf("%d-%02d-%02d\n",neww[2] / 10000, neww[2] % 10000 / 100, neww[2] % 100);
printf("%d-%02d-%02d\n",neww[3] / 10000, neww[3] % 10000 / 100, neww[3] % 100);
}
return 0;
}
如果想看是否超出资源约定,可以试着加入以下元素
#include <time.h> 头文件
double start,finish; 变量
程序运行时间,在程序开始处用start=(double) clock(); 获得开始时间
在程序结束处用finish=(double)clock(); 获得结束时间
然后输出时间差 毫秒 数:
printf("%.4f ms",finish-start);
要查看内存使用情况可以在任务管理器中查看
我这个代码都是在资源约定以内的