c语言高斯日记
发布网友
发布时间:2022-05-29 05:16
我来回答
共1个回答
热心网友
时间:2023-10-05 07:01
首先我们需要注意一下,题干中“高斯生日1777年4月30日的5343天后是1791年12月15日”,这里得出一个结论,高斯生日当天为第1天。
求高斯日记所标注的数字的年月日,可以自1777年4月30日起,累加“标注数字-1次”来得出结果。算法的核心即实现日期累加。
#include<stdio.h>
int dpm[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //每个月的天数
struct ymd {
int year,month,day;
};
void gaussBirthday (struct ymd * gbd) { //定义高斯的生日
gbd->year = 1777;
gbd->month = 4;
gbd->day = 30;
}
void copyDate (struct ymd * a, struct ymd * b) {
b->year = a->year;
b->month = a->month;
b->day = a->day;
}
int isLeap (int year) {
return (year%4==0&&year%100!=0)||year%400==0;
}
int printDate (struct ymd * d) { //打印日期 控制个位数月、日前补0
printf ("%d-",d->year);
if (d->month<10)
printf ("0%d-",d->month);
else
printf ("%d-",d->month);
if (d->day<10)
printf ("0%d",d->day);
else
printf ("%d",d->day);
printf ("\n");
}
void date (struct ymd * gd, int day) { //计算距离高斯生日第n天的日期
while (day-1) { //自高斯生日起累加至日记标识数字-1
if (gd->month == 12 && gd->day == dpm[12]) { //年底处理
gd->year ++;
gd->month = 1;
gd->day = 1;
}
else if (gd->day >= dpm[gd->month]) { //月底处理
if (isLeap (gd->year) && gd->month == 2 &&gd->day != 29) //闰年2月底处理
gd->day ++;
else {
gd->month ++;
gd->day = 1;
}
}
else
gd->day ++;
day--;
}
}
int main (void) {
struct ymd gbd; //高斯生日
struct ymd gd; //高斯日记种标识的数字所代表的日期
int day; //高斯日记种标识的数字
gaussBirthday (&gbd);
copyDate (&gbd, &gd);
printf ("请输入高斯日记中标识的数字:");
scanf ("%d",&day);
printf ("======================================================\n");
date (&gd, day);
printDate (&gd);
return 0;
}
执行结果
输入题干已知的“5343”
输出1791-12-15,以验证算法
输入高斯获得博士学位当天日记所标注的数字“8113”
输出1799-07-16
追答有个小地方写错了。int printDate (struct ymd * d) ,这块儿改成:void printDate (struct ymd * d)