中国のことわざに「漁三日、網干し二日」というものがあります。1990 年 1 月 1 日から「3 日間
漁をしこの人に、将来の特定の日に「漁」をするのか、それとも「網を干す」のかを尋ねてください。
質問の意味に応じて、問題解決のプロセスは 3 つのステップに分けることができます。
(1) 1990 年 1 月 1 日から指定された日付までの合計日数を計算します。
(2)「漁」と「網干し」のサイクルは5日なので、計算した日数を5で割ります。
(3) 残りに応じて、「釣り」をしているのか「投網」をしているのかを判断します。
残りが 1、2、3 の場合は「釣り」をしており、そうでない場合は「網を干している」ことになります。
アルゴリズム設計:
このアルゴリズムは数値計算アルゴリズムであり、指定された日付から 1990 年 1 月 1 日までの日数を求める周期を使用し、その周期内で閏年を考慮する必要があります
。閏年の2月は29日、
平年の2月は28日です。
閏年を判断する方法は、(4 で割り切れて 100 で割り切れない) または
(400 で割り切れる) 場合、その年は閏年であり、それ以外の場合は閏年ではありません。
#include"stdio.h"
struct DATA //创建年月日类型的数据
{
int year;
int month;
int day;
};
int PanDuan(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return 1;
}
else
return 0;
}
int JiSuan(struct DATA d, int today)
{
int year = 0;
int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; // 一年12个月,每个月的天数。
/// 年的天数相加
for (year = 1990; year < d.year; year++)
{
if (PanDuan(year)) // 判断闰年还是平年,修改二月的天数
arr[2] = 29;
else
arr[2] = 28;
//把一年的天数加起来
int j = 0;
for (j = 0; j < 13; j++)
{
today += arr[j];
}
}
// 把月的天数也加起来
int month = 0;
for (month = 0; month <= d.month-1; month++)
{
today += arr[month];
}
// 把天数加起来
today += d.day;
return today;
}
int main()
{
struct DATA d;
int today = 0; // 距今天的总天数
printf("请输入截止时间:");
scanf("%d %d %d", &d.year, &d.month, &d.day);
int day = JiSuan(d,today);
if ((day % 5) > 0 && (day % 5) < 4)
printf("距离今天共计:%d天,今天打鱼",day);
else
printf("距离今天共计:%d天,今天晒网",day);
}
プログラム実行結果: