C语言算法练习之打鱼还是晒网

1. 问题描述

中国有句俗语叫 “ 三天打鱼两天晒网 ”。某人从 1990 年 1 月 1 日起开始 “三天打鱼两天晒网”,问这个人在以后的某一天中是 “打鱼” 还是 “晒网”。

2. 题目分析

根据题意可以将解题过程分为 3 步:

(1) 计算从 1990 年 1 月 1 日开始至指定日期共有多少天。

(2) 由于 “打鱼” 和 “晒网” 的周期为 5 天,所以将计算出的天数用 5 去除。

(3) 根据余数判断他是在 “打鱼” 还是在 “晒网”。

若余数为 1, 2, 3,则他是在 “打鱼”,否则是在 “晒网”。

3. 算法设计

该算法为数值计算算法,要利用循环求出指定日期距 1990 年 1 月 1 日的天数,并考虑到循环过程中的闰年情况,闰年二月为 29 天,平年二月为 28 天。

判断闰年的方法如下:

如果(能被 4 整除并且不能被 100 整除)或者(能被 400 整除)则该年是闰年;否则不是闰年。

提示:C语言中判断能否整除可以使用求余运算符 %

4. 流程框架

求出指定日期距离

这里为整个算法的核心部分,经过分析可以得到: (指定日期距离 1990 年 1 月 1 日的天数)totalDay = 1990 年到指定年的前一年共有多少天 + 指定年中到指定日期的天数。

由于每月天数不同,可以设置一个月份数组int perMonth[13],存放每月的天数。

程序利用年份作为循环变量,要判断指定年份之前的每一年是否为闰年,若为闰年则执行totalDay=totalDay+366,否则执行 totalDay=totalDay+365;

对于指定年份,也要判定是否为闰年,然后根据月份数,将每月的天数累加到 totalDay 中。

perMonth 数组的初始化设置如下图所示

perMonth 数组设置含有 13 个元素,perMonth[0]元素并不使用。

原因在于这种设置可以使数组下标和月份对应,便于编程设置循环变量,数组中 2 月天数初始设置为 28,如果当前年份为闺年,则需要执行 perMonth[2]++ 操作。

设计一个函数int run Year(int year) 来判断是否为闰年。

求总天数函数int countDay(Date currentDay)的实现。

5. 代码实现

完整代码

#include <stdio.h>

//定义日期结构体
typedef struct DATE
{
	int year;
	int month;
	int day;
}DATE;

//判断闰年函数
int runYear(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		return 1;
	else
		return 0;
}

//计算指定日期距离 1990 年 1 月 1 日的天数
int countDay(DATE currentDay)
{
	//定义一个每月天数的数组
	int perMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

	int totalDay = 0;
	int i = 0;
	int year = 0;

	//求出指定日期之前的每一年的天数累加和
	for (year = 1990; year < currentDay.year; year++)
	{
		if (runYear(year))
		{
			totalDay = totalDay + 366;
		}
		else
		{
			totalDay = totalDay + 365;
		}
	}

	//如果为闰年,则2月份为29天
	if (runYear(currentDay.year))
	{
		perMonth[2]++;
	}

	//将本年内的天数累加到totalDay中
	for (i = 1; i < currentDay.month; i++)
	{
		totalDay += perMonth[i];
	}

	//将本月内的天数累加到totalDay中
	totalDay += currentDay.day;

	return totalDay;
}

int main()
{
	DATE today; //指定日期
	int totalDay; //指定日期距离1990年1月1日的天数
	int result; //totalDay对5取余的结果

	printf("请输入指定日期,包括年,月,日,例如:1999 1 31\n");
	printf("请输入>:");
	scanf("%d%d%d", &today.year, &today.month, &today.day);

	totalDay = countDay(today); //求出指定日期距离1990年1月1日的天数

	result = totalDay % 5; //天数%5 判断是打鱼还是晒网
	if (result > 0 && result < 4)
	{
		printf("今天打鱼\n");
	}
	else
	{
		printf("今天晒网\n");
	}
}

运行结果

我们怎么判断出这个程序是正确的呢? 很简单,因为题目是从 1990 年 1 月 1 日开始的,那么1,2,3日肯定是 “打鱼” ;4,5日肯定是 “晒网”。

到此这篇关于C语言算法练习之打鱼还是晒网的文章就介绍到这了,更多相关C语言 打鱼还是晒网内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言每日练习之求两个矩阵的乘积详解

    目录 分析 代码实现 总结 分析 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中. 矩阵的乘法有以下注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和. 代码实现:只需要用矩阵乘积的公式求出新的矩阵,即为两个矩阵的乘积,程序中

  • C语言每日练习之字符串反转

    目录 分析 代码实现 网上参考 总结 分析 在第18天:利用递归函数调用方式,将所输入的字符以相反顺序打印出来中,已经用过递归实现字符顺序输入,逆序输出,今天的题目是字符串反转,将以字符数组的形式来进行操作. 代码实现 #include <stdio.h> #include <string.h> #define MAX_LENGTH 50 //最大长度 char *String_Invertion(char *str); int main() { char string[MAX_L

  • C语言每日练习之进制转换

    目录 分析 代码实现 网上参考 总结 分析 我一开始的想法是通过输入整数形式八进制来转换成十进制输出,后来发现用字符数组输入更方便.我这里就讲讲我用整型数据输入的转换思路: 我们都知道二进制由0和1组成,3位二进制组成在一起,就可以表示0-7这八个数,所以八进制实际上就是3位二进制的组合(同理十六进制是4位二进制的组合),C语言的位运算操作的是二进制,算术运算针对的是十进制,所以,我们可以通过位运算求出八进制的每一位数(3位二进制为1位),然后通过算术运算符+,将他们加起来.和十进制运算不同的地

  • C语言每日练习之冒泡排序

    目录 分析 代码实现 运行结果 总结 分析 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 冒泡排序(这里只讨论从小到大排序)可以通过二种方式实现,分别是将最小值依次移动到头部和将最大值依次移动到尾部. 代码实现 代码采用从数组头部轮询的方式: #include <stdio.h> #define INTEGER_RANGE 10 //数字范围 void bubule_sort(int *array, int len); int main() { int i =

  • C语言每日练习之乒乓球比赛问题

    目录 题目描述 分析 代码实现 后期完善 网上参考 解法一: 解法二: 总结 题目描述 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单 分析 简单的组合问题,而且不考虑排序,如果固定a,b,c分别在0-2三个比赛队伍,那么两球队最多3种组合方式,全部轮询一遍即可. 代码实现 代码写的有点糟 #include <stdio.h> int main() { in

  • C语言每日练习之二叉堆

    目录 一.堆的概念 1.概述 2.定义 3.性质 4.作用 二.堆的存储结构 1.根结点编号 2.孩子结点编号 3.父结点编号 4.数据域 5.堆的数据结构 三.堆的常用接口 1.元素比较 2.交换元素 3.空判定 4.满判定 5.上浮操作 6.下沉操作 四.堆的创建 1.算法描述 2.动画演示 3.源码详解 五.堆元素的插入 1.算法描述 2.动画演示 3.源码详解 五.堆元素的删除 1.算法描述 2.动画演示 3.源码详解 总结 一.堆的概念 1.概述 堆是计算机科学中一类特殊的数据结构的统

  • C语言算法练习之抓交通肇事犯

    1. 问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征. 甲说:牌照的前两位数字是相同的: 乙说:牌照的后两位数字是相同的,但与前两位不同: 丙是数学家,他说:四位的车号刚好是一个整数的平方. 请根据以上线索求出车号. 2. 题目分析 按照题目的要求造出一个前两位数相同.后两位数相同且相互间又不同的 4 位整数,然后判断该整数是否是另一个整数的平方. 即求一个四位数 a 1.a 2 .a 3. a 4,满足如下的条件: 3. 算法设计 该题

  • C语言算法练习之打鱼还是晒网

    1. 问题描述 中国有句俗语叫 " 三天打鱼两天晒网 ".某人从 1990 年 1 月 1 日起开始 "三天打鱼两天晒网",问这个人在以后的某一天中是 "打鱼" 还是 "晒网". 2. 题目分析 根据题意可以将解题过程分为 3 步: (1) 计算从 1990 年 1 月 1 日开始至指定日期共有多少天. (2) 由于 "打鱼" 和 "晒网" 的周期为 5 天,所以将计算出的天数用 5 去

  • Go语言算法之寻找数组第二大元素的方法

    本文实例讲述了Go语言算法之寻找数组第二大元素的方法.分享给大家供大家参考.具体如下: 该算法的原理是,在遍历数组的时,始终记录当前最大的元素和第二大的元素.示例代码如下: 复制代码 代码如下: package demo01    import (      "fmt"  )    func NumberTestBase() {      fmt.Println("This is NumberTestBase")        nums := []int{12, 2

  • C语言算法金手指摩尔投票法手撕绝大多数问题

    目录 正片开始 概念 优点 算法核心 实现 正片开始 概念 嘛是摩尔投票法?简单来说就是投票法,算法解决的问题是如何在任意多的候选人,选出获得票数最多的那个.常见的算法是扫描一遍选票,也就是遍历,对每个候选人进行统计的选票进行统计. 那我遍历难道不香吗? 这里就要讲一下投票法的过人之处 优点 当执行有序情况时,只要找到中位数,然后检查中位数的个数是否超过选票的一半即可.但是当对象的数目不定时,统计选票可能会执行较长时间,相比原来的时间复杂度 O(n) ,可能需运行 O(n^2) 的时间. 针对无

  • C语言算法练习之佩奇借书

    目录 1. 问题描述 2. 题目分析 3. 算法设计 4. 代码实现 5. 算法升级 1. 问题描述 佩奇有5本新书,要借给A.B.C这3位小朋友,若每人每次只能借1本,则可以有多少种不同的借法? 2. 题目分析 本题属于数学当中常见的排列组合问题,即求从 5 个数中取 3 个不同数的排列组合的总数. 我们可以将 5 本书进行 1-5 的编号,A.B.C 3个人每次都可以从 5 本书中任选 1 本,即每人都有 5 种选择,由于 1 本书不可能同时借给一个以上的人,因此只要这 3 个人所选书的编号

  • C语言算法练习之佩奇存钱方案

    目录 1. 问题描述 2. 问题分析 3. 算法设计 4. 代码实现 1. 问题描述 假设银行一年整存零取的月息为 0.63%. 现在佩奇手中有一笔钱,她打算在今后的 5 年中的每年年底取出 1000 元,到第 5 年时刚好取完. 请算出佩奇存钱时应存入多少? 2. 问题分析 根据题意,可以从第 5 年向前推算. 已知 “在今后的 5 年中,每年的年底取出 1000 元,这样到第 5 年的时候刚好可以取完”,因此,第 5 年年底会取出 1000 元,则可以计算出第 5 年年初在银行中所存的钱数为

  • C语言算法打卡回文串验证算法题解

    目录 概念 Leetcode例题: 1.回文串的验证 2.有效回文 3.回文排列 点杀回文排列 点杀回文验证(有效性) 对撞指针 概念 所谓回文串,就是字符串反转以后和原串相同,如 abba 和 lippil.对于回文串还是比较容易去验证的,从字符数组的两端开始向中间靠拢去验证字符是否相等,但这里是否需要考虑字符数组长度的奇偶性呢?其实是不用的,下面一起来看看: Leetcode例题: 1.回文串的验证 2.有效回文 3.回文排列 (1,2题是一样的,合并讲解吧) 点杀回文排列 先讲回文排列吧,

  • C语言算法练习之折半查找的实现

    目录 1. 题目描述 2. 问题分析 3. 算法设计 4. 动图演示 5. 代码实现 6.知识点补充 continue 语句 break 语句 continue语句 和 break语句的区别 7. 问题拓展 1. 题目描述 N 个有序整数数列已放在一维数组中,利用二分查找法查找整数 m 在数组中的位置. 若找到,则输出其下标值:反之,则输出 “ Not be found!”. 2. 问题分析 二分查找法(也叫折半查找)其本质是分治算法的一种. 所谓分治算法是指的分而治之,即将较大规模的问题分解成

  • C语言算法学习之双向链表详解

    目录 一.练习题目 二.算法思路 1.设计浏览器历史记录 2.扁平化多级双向链表 3.展平多级双向链表 4.二叉搜索树与双向链表 一.练习题目 题目链接 难度 1472. 设计浏览器历史记录 ★★★☆☆ 430. 扁平化多级双向链表 ★★★☆☆ 剑指 Offer II 028. 展平多级双向链表 ★★★☆☆ 剑指 Offer 36. 二叉搜索树与双向链表 ★★★★☆ 二.算法思路 1.设计浏览器历史记录 1.这是一个模拟题: 2.初始化生成一个头结点,记录一个当前结点: 3.向前 和 向后 是两

  • C语言算法积累加tag的循环队列

    题目: 若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”. 试编写与此结构相应的入队和出队算法. 关键字: 循环队列+tag的使用 思路 : 循环队列: 需要变量:队头指针front,队尾指针rear,增减元素的开关:tag 1)入队算法 尾插法:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%Maxsize;Q.tag=1 队空条件:Q.front== Q.re

随机推荐