坂本智彦的算法-寻找星期几

坂本智彦的算法-寻找星期几

在本文中,我们将讨论什么是 Tomohiko Sakamoto 算法以及如何使用该算法来识别给定日期是一周中的哪一天。有多种算法可以知道星期几,但这种算法是最强大的一种。该算法以尽可能最小的时间和最小的空间复杂度找到该日期出现的月份中的哪一天。

问题陈述 – 我们根据格鲁吉亚历给出一个日期,我们的任务是使用 Tomohiko Sakamoto 的算法找出给定日期是一周中的哪一天。

示例

输入 – 日期 = 30,月份 = 04,年份 = 2020

输出 – 给定日期是星期一

输入 – 日期 = 15,月份 = 03,年份 = 2012

输出 – 给定日期是星期四

输入 – 日期 = 24,月份 = 12,年份 = 2456

输出 – 给定日期是星期日

坂本智彦算法

现在让我们讨论坂本智彦算法背后的直觉。

众所周知,根据格鲁吉亚历,公元 1 月 1 日是星期一。

案例1忽略闰年

我们首先讨论忽略所有闰年的情况,即一年共有 365 天。

由于一月有 31 天,一周有 7 天,所以我们可以说一月有 7*4 + 3 天,这意味着二月的第一天总是在一月的第一天之后 3 天。 p>

由于二月有 28 天(闰年除外),它本身是 7 的倍数,我们可以说 3 月 1 日将与 2 月 1 日在同一天,这意味着 3 月 1 日也将是 3 1 月 1 日之后的几天。

现在,对于 4 月,3 月有 31 天,即 7*4 +3,这意味着它将发生在 3 月 1 日的 3 天之后。因此,我们可以说 4 月 1 日将发生在 1 月 1 日 1 日后 6 天。

我们现在将构建一个数组,其中 arr[i] 表示相对于 1 月 1 日这一天,第 i 个月发生后的额外天数。

我们有 arr[] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 }。

案例 2 闰年

现在让我们讨论一下闰年的情况。

每四年,我们的计算中就会增加一天,但每百年则不增加一天。我们必须考虑到这些额外的日子。为此,我们将使用公式 –

年/ 4(每 4 年)

– 年 / 100(对于每 100 年,即 4 的倍数但仍然不是闰年,我们会将其从闰年中删除)

+ 年/ 400(每第 400 年,它是 100 的倍数,但仍然是一个循环年)

这个公式将为我们提供准确的闰年数。不过,有一个例外。

现在,我们知道 2 月 29 日被视为闰日,而不是 1 月 0 日。

这意味着我们不需要将一年中的前两个月纳入计算中,因为闰日对其没有影响。因此,如果是一月或二月,我们将从年份中减去 1 进行补偿。因此,在这些月份中,year/4 的值应该基于上一年而不是当前年份。

为了解决闰年问题,我们可以将 2 月之后每个月的 arr[] 值减去 1,以填补空白。这样就解决了闰年的问题。我们需要对算法进行以下更改,以使其在闰年和平年都能发挥作用。

arr[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }

如果当前月份是一月或二月,我们需要将年份减 1。

我们需要将模数内的年增量修改为year +year/4 –year/100 +year/400而不是year。此更改是必要的,以考虑闰年中的额外一天并相应地调整计算。

示例

此方法的代码是:

#include using namespace std;// code to find out the day number of the given dateint Weekday(int year, int month, int day) {   int arr[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };   if ( month  

输出

The given date is on Wednesday

登录后复制

复杂性

时间复杂度 - 此方法的时间复杂度为 O(1)

空间复杂度- 这种方法的空间复杂度是 O(1),因为我们没有使用任何额外的空间。

结论 - 在本文中,我们讨论了 Tomohiko Sakamoto 的算法以及该算法背后的直觉

以上就是坂本智彦的算法-寻找星期几的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2584164.html

(0)
上一篇 2025年3月6日 14:45:03
下一篇 2025年2月27日 09:25:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用C++编写的矩阵中找到具有最大和的一对的算法

    在本文中,我们将讨论在给定矩阵或二维数组中查找具有最大和的对。例如 Input : matrix[m][n] = {   { 3, 5, 2 },   { 2, 6, 47 },   { 1, 64, 66 } }Output : 130E…

    2025年3月6日
    200
  • 在C++中,将以下内容翻译为中文:寻找长度和宽度之间差异最小的矩形

    给定一个矩形区域作为输入。目标是找到矩形的边,使长度和宽度之间的差异最小。 矩形的面积 = 长度 * 宽度。 示例 输入− 面积 = 100 输出− 差异最小的矩形边: 长度 = 10,宽度 = 10 立即学习“C++免费学习笔记(深入)”…

    2025年3月6日
    200
  • 如何使用C++中的插值搜索算法

    如何使用C++中的插值搜索算法 导言:在许多应用程序中,我们常常需要在有序数组或有序数据集合中进行搜索和查找特定的元素。传统的二分搜索算法是最常用的方法之一,但在某些情况下,它可能不够高效。插值搜索算法是一种改进的搜索算法,它可以根据已知数…

    2025年3月6日
    200
  • 如何使用C++中的插入排序算法

    使用C++中的插入排序算法实现数组排序 插入排序是一种简单但有效的排序算法,它将待排序的元素一个一个地插入已排序的列表中,最终得到一个有序的列表。本文将介绍如何使用C++编程语言实现插入排序算法,并给出具体的代码示例。 算法思想:插入排序的…

    2025年3月6日
    200
  • 如何使用C++中的斐波那契数列算法

    如何使用C++中的斐波那契数列算法 斐波那契数列是一个非常经典的数列,它的定义是每个数字都是前两个数字之和。在计算机科学中,用C++编程语言来实现斐波那契数列算法是一项基础且重要的技能。本文将介绍如何使用C++来编写斐波那契数列算法,并提供…

    2025年3月6日
    200
  • 如何使用C++中的八皇后问题算法

    如何使用C++中的八皇后问题算法 八皇后问题是一个经典的算法问题,要求在8×8的棋盘上放置八个皇后,使得任意两个皇后都不能互相攻击,即任意两个皇后不能处于同一行、同一列或者同一对角线上。解决八皇后问题的算法有很多,其中一种常见的方…

    2025年3月6日
    200
  • 如何使用C++中的最小公倍数算法

    如何使用C++中的最小公倍数算法 最小公倍数(Least Common Multiple,简称LCM)是指两个或多个整数公有的倍数中最小的那一个。在数学和计算机科学中,求最小公倍数是一个常见的问题,而C++提供了一种简单而有效的方法来计算最…

    2025年3月6日
    200
  • 如何使用C++中的冒泡排序算法

    如何使用C++中的冒泡排序算法 冒泡排序算法是一种简单但不高效的排序算法,它通过多次比较和交换来将一个序列按照从小到大(或者从大到小)的顺序排列。这里我们将介绍如何使用C++语言实现冒泡排序算法,并附上详细的代码示例。 算法原理:冒泡排序算…

    2025年3月6日
    200
  • 如何使用C++中的最长递增子序列算法

    如何使用C++中的最长递增子序列算法,需要具体代码示例 最长递增子序列(Longest Increasing Subsequence,简称LIS)是一个经典的算法问题,其解决思路可以应用于多个领域,如数据处理、图论等。在本文中,我将为大家介…

    2025年3月6日
    200
  • 如何使用C++中的计数排序算法

    如何使用C++中的计数排序算法 计数排序算法是一种比较简单且高效的排序算法,适用于对整数序列进行排序的场景。它的基本思想是确定每个元素前面有多少个元素比它小,从而确定它在有序数组中的位置。 计数排序算法的步骤如下: 找出待排序数组中的最大值…

    2025年3月6日
    200

发表回复

登录后才能评论