日期与星期的计算:
已知1990年元旦是星期一,用函数实现:
( 1)求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)。
( 2) 输出1990年到2019年元旦为星期一的年份。
(3)从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
#include <stdio.h>
// 判断是否是闰年函数,如果是则返回 1,否则返回 0
int isLeap(int year) {
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0;
}
// 统计1990年到2019年元旦为星期一的年份,并输出结果
void countNewYearMondays() {
int num = 0; // 统计星期一的个数
int year, days, y, weekday;
printf("1990年到2019年元旦为星期一的年份:\n");
for(year = 1990; year <= 2019; year++) {
days = 0; // 当前年份距离1990年元旦的天数
for(y = 1990; y < year; y++) {
if(isLeap(y))
{days += 366;}
else
{days += 365;}
}
weekday = (days + 1) % 7; // 当前年份的元旦是星期几
if(weekday == 1) {
printf("\t%d", year); // 输出符合条件的年份
num++; // 统计个数
}
}
printf("\n\n1990年到2019年元旦共有%d个元旦是星期一\n\n", num); // 输出总数
}
// 根据输入的日期,计算出这一天是星期几,并输出结果
void getWeekDay() {
int year, month, day, days, y, m;
printf("请输入一个日期(格式:XXXX XX XX,如:2023 05 11):");
scanf("%d %d %d", &year, &month, &day);
days = 0;
// 计算输入年份距离1990年元旦的天数days
for(y = 1990; y < year; y++) {
if(isLeap(y))
{days += 366;}
else {days += 365;}
}
// 计算到输入月份最后一天的天数days
for(m = 1; m < month; m++) {
switch(m) {
case 4:
case 6:
case 9:
case 11:
days += 30;
break;
case 2:
days += (isLeap(year) ? 29 : 28);
break;
default:
days += 31;
}
}
days += day - 1; // 加上输入的天数
int weekday = (days + 1) % 7; // 计算是星期几
// 根据结果输出星期几
switch(weekday) {
case 0:
printf("%d年%d月%d日是星期日\n", year, month, day);
break;
case 1:
printf("%d年%d月%d日是星期一\n", year, month, day);
break;
case 2:
printf("%d年%d月%d日是星期二\n", year, month, day);
break;
case 3:
printf("%d年%d月%d日是星期三\n", year, month, day);
break;
case 4:
printf("%d年%d月%d日是星期四\n", year, month, day);
break;
case 5:
printf("%d年%d月%d日是星期五\n", year, month, day);
break;
default:
printf("%d年%d月%d日是星期六\n", year, month, day);
}
}
// 主函数
int main() {
countNewYearMondays(); // 统计1990年到2019年元旦为星期一的年份
getWeekDay(); // 输入日期,计算是星期几
return 0;
}
我用基姆拉尔森给你实现:
#include <stdio.h>
void countMondays() {
int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
int days = 365;
int leap = 0;
int countMondays = 0;
for (int i = 1990; i <= 2019; i++) {
count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
if (count == 1) {
countMondays++;
}
}
printf("1990年元旦到2019年元旦中有%d个元旦是星期一\\n\\n", countMondays);
}
void printMondays() {
printf("1990年到2019年元旦为星期一的年份为:");
for (int year = 1990; year <= 2019; year++) {
int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
for (int i = 1990; i < year; i++) {
count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
}
if (count == 1) {
printf("%d ", year);
}
}
printf("\\n\\n");
}
void calculateWeekday() {
int year, month, day;
printf("请输入日期:");
scanf("%d-%d-%d", &year, &month, &day);
int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
for (int i = 1990; i < year; i++) {
count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
}
int days = 0;
for (int i = 1; i < month; i++) {
if (i == 2) {
days += (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28);
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
days += 30;
} else {
days += 31;
}
}
days += day;
count = (count + days - 1) % 7;
printf("%d年%d月%d日是星期%d\\n\\n", year, month, day, count);
}
int main() {
countMondays();
printMondays();
calculateWeekday();
return 0;
}
#include <stdio.h>
// 函数声明
int isLeapYear(int year);
int countLeapYears(int year);
int getDayOfWeek(int year, int month, int day);
int countMondays(int startYear, int endYear);
void printMondays(int startYear, int endYear);
int getWeekday(int year, int month, int day);
int main() {
int startYear = 1990;
int endYear = 2019;
// 问题 1:求1990年元旦到2019年元旦中有几个元旦是星期一
int mondaysCount = countMondays(startYear, endYear);
printf("从1990年元旦到2019年元旦中有 %d 个元旦是星期一\n", mondaysCount);
// 问题 2:输出1990年到2019年元旦为星期一的年份
printf("1990年到2019年元旦为星期一的年份为:\n");
printMondays(startYear, endYear);
// 问题 3:从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
int year, month, day;
printf("请输入日期(格式:年 月 日):");
scanf("%d %d %d", &year, &month, &day);
int weekday = getWeekday(year, month, day);
printf("该日期是星期%d\n", weekday);
return 0;
}
// 判断是否为闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算闰年的数量
int countLeapYears(int year) {
if (year <= 2) {
return 0;
} else {
return year / 4 - year / 100 + year / 400;
}
}
// 计算给定日期是星期几
int getDayOfWeek(int year, int month, int day) {
// 蔡勒公式
if (month < 3) {
month += 12;
year--;
}
int century = year / 100;
year %= 100;
int weekday = (year + year / 4 + century / 4 - 2 * century + 26 * (month + 1) / 10 + day - 1) % 7;
if (weekday < 0) {
weekday += 7;
}
return weekday;
}
// 计算某个时间段内元旦为星期一的数量
int countMondays(int startYear, int endYear) {
int count = 0;
for (int year = startYear; year <= endYear; year++) {
if (getDayOfWeek(year, 1, 1) == 1) {
count++;
}
}
return count;
}
void printMondays(int startYear, int endYear) {
printf("1990年到2019年元旦为星期一的年份为:\n");
for (int year = startYear; year <= endYear; year++) {
if (getWeekday(year, 1, 1) == 1) {
printf("%d\n", year);
}
}
}
int getWeekday(int year, int month, int day) {
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int totalDays = 0;
for (int y = 1990; y < year; y++) {
totalDays += 365;
if (isLeapYear(y)) {
totalDays += 1;
}
}
for (int m = 1; m < month; m++) {
totalDays += daysInMonth[m];
if (m == 2 && isLeapYear(year)) {
totalDays += 1;
}
}
totalDays += day;
int weekday = (totalDays + 1) % 7; // 元旦是星期一,所以需要加1
return weekday;
}
该回答引用ChatGPTc
#include <stdio.h>
// 1.计算1990年元旦到2019年元旦中有几个元旦是星期一
int countMondays() {
int year, day, i, count = 0;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 计算1990年元旦到2018年12月31日的天数
day = (365 * 28 + 7) % 7; // 初始星期一
for (year = 1990; year <= 2018; year++) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < 12; i++) {
if (day == 0 && i == 0) { // 元旦是星期一
count++;
}
day = (day + month_days[i] % 7) % 7;
}
}
if (day == 0) { // 2019年元旦是星期一
count++;
}
return count;
}
// 2.输出1990年到2019年元旦为星期一的年份
void printMondays() {
int year, day, i;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 计算1990年元旦到2018年12月31日的天数
day = (365 * 28 + 7) % 7; // 初始星期一
for (year = 1990; year <= 2018; year++) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < 12; i++) {
if (day == 0 && i == 0) { // 元旦是星期一
printf("%d年
", year);
}
day = (day + month_days[i] % 7) % 7;
}
}
if (day == 0) { // 2019年元旦是星期一
printf("2019年
");
}
}
// 3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
void printWeekday() {
int year, month, day, i, count = 0;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int weekday[7] = {'日', '一', '二', '三', '四', '五', '六'};
printf("请输入日期(格式: 年 月 日,如2019 1 1): ");
scanf("%d %d %d", &year, &month, &day);
// 计算1990年元旦到该日期的天数
for (i = 1990; i < year; i++) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
count += 366; // 闰年366天
} else {
count += 365; // 平年365天
}
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < month - 1; i++) {
count += month_days[i];
}
count += day - 1; // 日期是从0开始计数的,所以要减1
printf("星期%c
", weekday[count % 7]);
}
int main() {
// 1.计算1990年元旦到2019年元旦中有几个元旦是星期一
printf("1990年元旦到2019年元旦中有%d个元旦是星期一
", countMondays());
// 2.输出1990年到2019年元旦为星期一的年份
printf("1990年到2019年元旦为星期一的年份有:
");
printMondays();
// 3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
printWeekday();
return 0;
}
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是用C语言编写日期与星期的计算的代码:
#include <stdio.h>
// 计算某个年份的元旦是星期几
int getDayOfWeek(int year) {
int days = 0;
for (int i = 1990; i < year; i++) {
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
days += 366;
} else {
days += 365;
}
}
return (days + 1) % 7;
}
// 计算某个年份中星期一的个数
int getMondayCount(int year) {
int dayOfWeek = getDayOfWeek(year);
int days = 0;
if (dayOfWeek == 1) {
days++;
}
for (int i = year + 1; i <= 2019; i++) {
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
days += 366;
} else {
days += 365;
}
}
int mondayCount = (days + dayOfWeek) / 7;
return mondayCount;
}
// 输出某个年份中元旦是星期一的年份
void printMondayYears() {
for (int year = 1990; year <= 2019; year++) {
int dayOfWeek = getDayOfWeek(year);
if (dayOfWeek == 1) {
printf("%d\n", year);
}
}
}
// 计算某个日期是星期几
void getDayOfWeekByDate(int year, int month, int day) {
int days = 0;
for (int i = 1990; i < year; i++) {
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
days += 366;
} else {
days += 365;
}
}
for (int i = 1; i < month; i++) {
if (i == 2) {
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
days += 29;
} else {
days += 28;
}
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
days += 30;
} else {
days += 31;
}
}
days += day - 1;
int dayOfWeek = (getDayOfWeek(year) + days) % 7;
switch (dayOfWeek) {
case 0:
printf("星期日\n");
break;
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
}
}
int main() {
// 求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)
int mondayCount = getMondayCount(1990);
printf("1990年到2019年元旦中有%d个元旦是星期一\n", mondayCount);
// 输出1990年到2019年元旦为星期一的年份
printf("1990年到2019年元旦为星期一的年份有:\n");
printMondayYears();
// 从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
int year, month, day;
printf("请输入一个日期(格式:年 月 日,例如:2019 5 11):\n");
scanf("%d %d %d", &year, &month, &day);
getDayOfWeekByDate(year, month, day);
return 0;
}
在这个代码中,我们使用了一些基本的日期计算方法来计算日期与星期。使用getDayOfWeek函数来计算某个年份中元旦是星期几,使用getMondayCount函数来计算某个年份中星期一的个数,使用printMondayYears函数来输出某个年份中元旦是星期一的年份,使用getDayOfWeekByDate函数来计算某个日期是星期几。在main函数中,我们调用这些函数来完成题目要求的计算。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
思路:
代码示例:
#include <stdio.h>
int main()
{
int year, month, day;
printf("请输入年月日(格式为yyyy-mm-dd):");
scanf("%d-%d-%d", &year, &month, &day);
// 计算该日期与1990年1月1日相差的天数
int offset = 0;
for (int i = 1990; i < year; i++)
{
// 判断该年是否是闰年
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
{
offset += 366;
}
else
{
offset += 365;
}
}
// 计算该月之前的天数
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
days_in_month[1] = 29;
}
for (int i = 0; i < month - 1; i++)
{
offset += days_in_month[i];
}
// 加上该月的天数
offset += day - 1;
// 计算星期几,0表示星期一,1表示星期二,以此类推
int weekday = (offset + 1) % 7;
printf("该日期是星期%d\n", weekday);
// 计算1990年到2019年元旦中有几个元旦是星期一
int count = 0;
for (int i = 1990; i <= 2019; i++)
{
int days = 0;
for (int j = 1990; j < i; j++)
{
// 判断该年是否是闰年
if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
{
days += 366;
}
else
{
days += 365;
}
}
if ((days + 1) % 7 == 0)
{
count++;
}
}
printf("1990年到2019年元旦中有%d个元旦是星期一\n", count);
// 输出1990年到2019年元旦为星期一的年份
printf("1990年到2019年元旦为星期一的年份为:\n");
for (int i = 1990; i <= 2019; i++)
{
int days = 0;
for (int j = 1990; j < i; j++)
{
// 判断该年是否是闰年
if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
{
days += 366;
}
else
{
days += 365;
}
}
if ((days + 1) % 7 == 0)
{
printf("%d\n", i);
}
}
return 0;
}