某人从1990年1月1日起开始“三天打鱼,两天晒网”,判断以后的某一天他是在“打渔”还是在“晒网”
*问题分析与算法设计
(1)计算从1990年1月1日开始至指定日期一共多少天(要判断经历的年份中是否有闰年(如果((年能被4除尽且不能被100除尽)或能被400除尽)则该年是闰年),若有闰年,二月为29天,平年为28天)
(2)由于“打渔”和“晒网”的周期为5天,所以将计算的天数用5去除
(3)根据余数判断他是在“打渔”还是在“晒网”: 若 余数为1,2,3,则他是在“晒网” ,否则 是在“晒网”
程序设计
#include <stdio.h>
struct date{
int year;
int month;
int day;
};
int main()
{
int year;
int day;
int yearday;
struct date today;
struct date term;
printf("please input year/month/day:");
scanf("%d%d%d",&today.year,&today.month,&today.day);
term.month = 12;
term.day = 31;
for(yearday = 0,year = 1990;year < today.year;year++)
{
term,year = year;
year += days(term);
}
yearday += days(today);
day = yearday % 5;
if(day > 0 && day < 4)
{
printf("he was fishing at that day. \n");
}
else
{
printf("he was sleeping at that day. \n");
}
return 0;
}
days(day)
struct date day;
{`
int i;
int lp;
static int day_tab[2][13] =
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31},
};
lp = day.year % 4 == 0 && day.year % 100 != 0 || day.year % 400 == 0;
for(i = 1;i < day.month ;i++)
{
day.day += day_tab[lp][i];
}
return day.day;
}
三位渔夫出海打渔,带了21只筐。返航时发现七只筐装满了鱼,还有七只筐装了半筐鱼,另外七只筐则是空的,7个满筐重量相等,7个半筐重量相等,在不将鱼倒出的情况下,将鱼和筐平分为三份。
每个人应分到7个箩筐,3.5筐鱼。采用3×3的数组a来表示三个人分到的东西。其中每个人对应数组a的一行,数组的第0列放分到鱼的整筐数,数组的第1列放分到鱼的半筐数,数组的第2列放分到的空筐数。
数组每行每列的元素之和为7
对数组的行来说,满筐数+半筐数=3.5
每个人所得到的满筐数不超过三筐
每个人都至少有同一个半筐,且半筐数为奇数
#include <stdio.h>
int main()
{
int i;
int j;
int k;
int m;
int n;
int flag;
int a[3][3];
int count = 0;
printf("It exists possible distribution plans:\n");
for(i = 0;i <= 3;i++)
{
a[0][0] = i;
for(j = i;j <= 7 - i && j <= 3;j++)
{
a[1][0] = j;
if((a[2][0] = 7 - j - a[0][0]) > 3)
{
continue;
}
if(a[2][0] < a[1][0])
{
break;
}
for(k = 1;k <= 5;k += 2)
{
a[0][1] = k;
for(m = 1;m < 7 - k;m += 2)
{
a[1][1] = m;
a[2][1] = 7 - k - m;
for(flag = 1,n = 0;flag != 0 && n < 3;n++)
{
if(a[n][0] + a[n][1] < 7 && a[n][0] * 2 + a[n][1] == 7)
{
a[n][2] = 7 - a[n][0] - a[n][1];
}
else
{
flag = 0;
}
}
if(flag)
{
printf("NO.%d Full basket Semi_basket Empty \n",++count);
for(n = 0;n < 3;n++)
{
printf("fisher %c: %d %d %d \n",
'A'+n ,a[n][0],a[n][1],a[n][2] );
}
}
}
}
}
}
return 0;
}