网站优化什么,上海有哪些公司名字叫什么,自己设计好的网站怎么设置访问,软件定制#x1f381;个人主页#xff1a;我们的五年
#x1f50d;系列专栏#xff1a;每日一练
#x1f337;追光的人#xff0c;终会万丈光芒 目录 前言#xff1a; #x1f337;1.问题描述#xff1a; 1.问题描述#xff1a;
2.输入格式#xff1a;
3.输出格式#…个人主页我们的五年
系列专栏每日一练
追光的人终会万丈光芒 目录 前言 1.问题描述 1.问题描述
2.输入格式
3.输出格式 2.问题分析 3.最终代码
总结 前言 这是学校组织比赛时的一道模拟题写完这道题我才发现我是真正的菜鸟希望通过这道题来对自己进行一个反省。 我是菜鸟所以我多练 1.问题描述 1.问题描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在1960年1月1日至2059年12月31日。 令小明头疼的是这些日期采用的格式非常不统一有采用年/月/日的有采用月/日/年的还有采用日/月/年的。 更加麻烦的是年份也都省略了前两位使得文献上的一个日期存在很多可能的日期与其对应。 比如02/03/04可能是2002年03月04日、2004年02月03日或2004年03月02日。 给出一个文献上的日期你能帮助小明判断有哪些可能的日期对其对应吗 2.输入格式 一个日期格式是”AA/BB/CC”。 即每个’/’隔开的部分由两个 0-9 之间的数字不一定相同组成。 3.输出格式 输出若干个不相同的日期每个日期一行格式是”yyyy-MM-dd”。 多个日期按从早到晚排列。 4.输入和输出样例 2.问题分析 mian函数 int main() { int a, b, c; scanf(%d/%d/%d, a, b, c); judge(a, b, c); //可能为年月日 judge(c, a, b); //可能为月日年 judge(c, b, a); //可能为日月年 qsort(data, k, sizeof(data[0]), cmp); for (int i 0; i k; i) printf(%d-%02d-%02d\n, data[i].year, data[i].month, data[i].day); return 0; } ⛳️1.对于日期类型的问题我们可以创建结构体来解题,本题三种情况我们只需创建结构体数组数组大小为3且为全局变量。 typedef struct DATA { int year; int month; int day; }DATA; DATA data[3]; ⛳️2.对于年份的问题我们也要去考虑闰年的情况 int is_leap_year(int n) { if (n % 4 0 n % 100 ! 0 || n % 400 0) return 1; return 0; } ⛳️3.本题还去判断日期是否合理我们知道年份是肯定没问题的只要去判断月和每个月的天数判断月份也很好判断只要month12month0。
但是每个月的天数就要根据具体的月份来定所以我们定义非闰年时的每个月的天数。
如果天数满足daydays[month]day0就是满足的. //定义非闰年情况的每个月的天数 int days[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; ⛳️4.设计符合题意的日期也就是该函数用来判断一个日期是否存在并且结构体里的日期不能重复。
year传过来的是一个两位数要通过判断是否大于等于60来判断是2000年还是1900年。判断完以后把year变为正确值。
然后就是判断是否存在该日期也就是判断月份和每个月的天数。❗️但是有一个点就是我们前面弄的是非闰年的每个月天数如果我们判断该年是闰年那么我们就去把days【2】1在函数末尾再变为非闰年的每个月天数。
month 0 month 12 day days[month] day0
判断完这个以后就是去判断是否重复先定义一个参考值flag通过for循环去判断如果重复了
就改变flag的值然后跳出循环最后判断flag的值就可以知道是否重复没有重复的就可以赋值给结构体数组。 void judge(int year, int month, int day) { int flag 1; //标记日期是否重复 //把年份变为正确的年份 if (year 60) year 2000; else year 1900; //年份可以不用判断肯定会满足题意的 //只要去判断月份每个月的天数就可以 if (is_leap_year(month)) days[2]; //如果是闰年就把天数变为29天 if (month 0 month 12 day days[month] day0) { //判断是否重复 for (int i 0; i k; i) { if (data[i].year year data[i].month month data[i].day) { flag 0; break; } } //没有重复就放入结构体数组 if (flag) { data[k].year year; data[k].month month; data[k].day day; k; //k为结构体里放了几个有效值一开始为0 } } //别忘记变为非闰年时二月的天数 if (is_leap_year(year)) days[2]--; } ⛳️4.现在的情况就是日期数组里已经放好了但是我们还没有进行排序下面在main函数中进行排序。并且利用去qsort函数 int cmp(const void* x, const void* y) { if (((DATA*)x)-year ((DATA*)y)-year) return 1; else if (((DATA*)x)-year ((DATA*)y)-year) return 0; else { if (((DATA*)x)-month ((DATA*)y)-month) return 1; else if (((DATA*)x)-month ((DATA*)y)-month) return 0; else { if (((DATA*)x)-day ((DATA*)y)-day) return 1; else return 0; } } } int main() { int a, b, c; scanf(%d/%d/%d, a, b, c); judge(a, b, c); //可能为年月日 judge(c, a, b); //可能为月日年 judge(c, b, a); //可能为日月年 qsort(data, k, sizeof(data[0]), cmp); for (int i 0; i k; i) printf(%d-%02d-%02d\n, data[i].year, data[i].month, data[i].day); return 0; } 3.最终代码
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#includestring.h
#includestdlib.h//定义非闰年情况的每个月的天数
int days[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };typedef struct DATA {int year;int month;int day;
}DATA;
DATA data[3];int k 0; //用于表示放了几个有效值//判断闰年的函数
int is_leap_year(int n)
{if (n % 4 0 n % 100 ! 0 || n % 400 0)return 1;return 0;
}void judge(int year, int month, int day)
{int flag 1; //标记日期是否重复//把年份变为正确的年份if (year 60)year 2000;elseyear 1900;//年份可以不用判断肯定会满足题意的//只要去判断月份每个月的天数就可以if (is_leap_year(month))days[2]; //如果是闰年就把天数变为29天if (month 0 month 12 day days[month] day0){//判断是否重复for (int i 0; i k; i){if (data[i].year year data[i].month month data[i].day){flag 0;break;}}if (flag){data[k].year year;data[k].month month;data[k].day day;k;}}//别忘记变为非闰年时二月的天数if (is_leap_year(year))days[2]--;
}int cmp(const void* x, const void* y)
{if (((DATA*)x)-year ((DATA*)y)-year)return 1;else if (((DATA*)x)-year ((DATA*)y)-year)return 0;else{if (((DATA*)x)-month ((DATA*)y)-month)return 1;else if (((DATA*)x)-month ((DATA*)y)-month)return 0;else{if (((DATA*)x)-day ((DATA*)y)-day)return 1;elsereturn 0;}}
}int main()
{int a, b, c;scanf(%d/%d/%d, a, b, c);judge(a, b, c); //可能为年月日judge(c, a, b); //可能为月日年judge(c, b, a); //可能为日月年qsort(data, k, sizeof(data[0]), cmp);for (int i 0; i k; i)printf(%d-%02d-%02d\n, data[i].year, data[i].month, data[i].day);return 0;
}
总结
我是菜鸡我菜所以我多练