当前位置: 首页 > news >正文

通化县建设局网站网络营销的案例分析

通化县建设局网站,网络营销的案例分析,网页制作的优势和劣势,网站建设模板型和定制型C语言根据日期判断星期几#xff08;使用基姆拉尔森计算公式#xff09; 算法如下#xff1a; 基姆拉尔森计算公式W (d2*m3*(m1)/5yy/4-y/100y/400) mod 7 在公式中d表示日期中的日数#xff0c;m表示月份数#xff0c;y表示年数。 注意#xff1a;在公式中有个与其他公式… C语言根据日期判断星期几使用基姆拉尔森计算公式 算法如下 基姆拉尔森计算公式W (d2*m3*(m1)/5yy/4-y/100y/400) mod 7 在公式中d表示日期中的日数m表示月份数y表示年数。 注意在公式中有个与其他公式不同的地方 把一月和二月看成是上一年的十三月和十四月例如果是2004-1-10则换算成2003-13-10来代入公式计算。以公元元年为参考公元元年1月1日为星期一 程序如下 /*利用基姆拉尔森计算日期公式  w(d2*m3*(m1)/5yy/4-y/100y/400)*/ #include stdio.hconst char * getWeekdayByYearday(int iY, int iM, int iD) {int iWeekDay -1; if (1 iM || 2 iM) { iM 12; iY--;} iWeekDay (iD 1 2 * iM 3 * (iM 1) / 5 iY iY / 4 - iY / 100 iY / 400) % 7;switch(iWeekDay){ case 0 : return Sunday; break;case 1 : return Monday; break;case 2 : return Tuesday; break;case 3 : return Wednesday; break;case 4 : return Thursday; break;case 5 : return Friday; break; case 6 : return Saturday; break;default : return NULL; break;} return NULL; }int main() {int year,month,day;char ch1;while(ch ! \033){ printf(\n请输入日期\n格式为1900,1,1\n);scanf(%d,%d,%d,year,month,day);const char * p getWeekdayByYearday(year, month, day);printf(WeekDay : %s\n, p);ch getchar();printf(\n);} } 运行效果 $ ./getweekdaybyday 请输入日期 格式为1900,1,1 2008,4,29 WeekDay : Tuesday请输入日期 格式为1900,1,1 2015,2,4 WeekDay : Wednesday请输入日期 格式为1900,1,1   编者注用来算现在真实日期的星期是没有问题的。原理是根据已知公元1年1月1日的星期数来推算。如果在你的题目中约定了某天是星期几你要注意那天的星期是否跟真实的星期相同如果不同需要考虑相差几天   如果大家觉得不够过瘾可以看看以下该公式的推导过程让大家对历法有个更深刻的认识 下面我们完全按自己的思路由简单到复杂一步步进行推导…… 推导之前先作两项规定 ①用 y, m, d, w 分别表示 年 月 日 星期(w0-6 代表星期日-星期六 ②我们从 公元0年1月1日星期日 开始 一、只考虑最开始的 7 天即 d 1---7 变换到 w 0---6 很直观的得到: w d-1 二、扩展到整个1月份 模7的概念大家都知道了也没什么好多说的。不过也可以从我们平常用的日历中看出来在周历里边每列都是一个按7增长的等差数列如1、8、15、22的星期都是相同的。所以得到整个1月的公式如下 w (d-1) % 7 --------- 公式⑴ 三、按年扩展 由于按月扩展比较麻烦所以将年扩展放在前面说 ① 我们不考虑闰年假设每一年都是 365 天。由于365是7的52倍多1天所以每一年的第一天和最后一天星期是相同的。 也就是说下一年的第一天与上一年的第一天星期滞后一天。这是个重要的结论每过一年公式⑴会有一天的误差由于我们是从0年开始的所以只须要简单的加上年就可以修正扩展年引起的误差得到公式如下 w (d-1 y) % 7 ② 将闰年考虑进去 每个闰年会多出一天会使后面的年份产生一天的误差。如我们要计算2005年1月1日星期几就要考虑前面的已经过的2004年中有多少个闰年将这个误差加上就可以正确的计算了。 根据闰年的定义(能被4整但不能被100整除或能被400整)得到计算闰年的个数的算式y/4 - y/100 y/400。 由于我们要计算的是当前要计算的年之前的闰年数所以要将年减1得到了如下的公式 w [d-1y (y-1)/4-(y-1)/100(y-1)/400] % 7 -----公式⑵ 现在我们得到了按年扩展的公式⑵用这个公式可以计算任一年的1月份的星期 四、扩展到其它月 考虑这个问题颇费了一翻脑筋后来还是按前面的方法大胆假才找到突破口。 ①现在我们假设每个月都是28天且不考虑闰年 有了这个假设计算星期就太简单了因为28正好是7的整数倍每个月的星期都是一样的公式⑵对任一个月都适用 ) ②但假设终究是假设首先1月就不是28天这将会造成2月份的计算误差。1月份比28天要多出3天就是说公式⑵的基础上2月份的星期应该推后3天。 而对3月份来说推后也是3天(2月正好28天对3月的计算没有影响)。 依此类推每个月的计算要将前面几个月的累计误差加上。 要注意的是误差只影响后面月的计算因为12月已是最后一个月所以不用考虑12月的误差天数同理1月份的误差天数是0因为前面没有月份影响它。 由此想到建立一个误差表来修正每个月的计算。  月 误差 累计 模7 1 3 0 0 2 0 3 3 3 3 3 3 4 2 6 6 5 3 8 1 6 2 11 4 7 3 13 6 8 3 16 2 9 2 19 5 10 3 21 0 11 2 24 3 12 - 26 5 (闰年时2月会有一天的误差但我们现在不考虑)  我们将最后的误差表用一个数组存放 在公式⑵的基础上可以得到扩展到其它月的公式 e[] {0,3,3,6,1,4,6,2,5,0,3,5} w [d-1y e[m-1] (y-1)/4-(y-1)/100(y-1)/400] % 7 --公式⑶ ③上面的误差表我们没有考虑闰年如果是闰年2月会一天的误差会对后面的3-12月的计算产生影响对此我们暂时在编程时来修正这种情况增加的限定条件是如果当年是闰年且计算的月在2月以后需要加上一天的误差。大概代码是这样的 w (d-1 y e[m-1] (y-1)/4 - (y-1)/100 (y-1)/400); if(m2 (y%40 y%100!0 || y%4000) y!0) w; w % 7; 现在已经可以正确的计算任一天的星期了。 注意0年不是闰年虽然现在大都不用这个条件但我们因从公元0年开始计算所以这个条件是不能少的。 ④ 改进 公式⑶中计算闰年数的子项 (y-1)/4-(y-1)/100(y-1)/400 没有包含当年如果将当年包含进去则实现了如果当年是闰年w 自动加1。 由此带来的影响是如果当年是闰年1,2月份的计算会多一天误差我们同样在编程时修正。则代码如下 w (d-1 y e[m-1] y/4 - y/100 y/400); ---- 公式⑷ if(m3 (y%40 y%100!0 || y%4000) y!0) --w; w % 7; 与前一段代码相比我们简化了 w 的计算部分。 实际上还可以进一步将常数 -1 合并到误差表中但我们暂时先不这样做。 至此我们得到了一个阶段性的算法可以计算任一天的星期了。 public class Week { public static void main(String[] args){ int y 2005; int m 4; int d 25; int e[] new int[]{0,3,3,6,1,4,6,2,5,0,3,5}; int w (d-1e[m-1]y(y2)-y/100y/400); if(m3 ((y3)0 y%100!0 || y%4000) y!0){ --w; } w % 7; System.out.println(w); } } 五、简化 现在我们推导出了自己的计算星期的算法了但还不能称之为公式。 所谓公式应该给定年月日后可以手工算出星期几的但我们现在的算法需要记住一个误差表才能进行计算所以只能称为一种算法还不是公式。 下面我们试图消掉这个误差表……  消除闰年判断的条件表达式  由于闰年在2月份产生的误差影响的是后面的月份计算。如果2月是排在一年的最后的话它就不能对其它月份的计算产生影响了。可能已经有人联想到了文章开头的公式中为什么1,2月转换为上年的13,14月计算了吧 )就是这个思想了我们也将1,2月当作上一年的13,14月来看待。 由此会产生两个问题需要解决 1一年的第一天是3月1日了我们要对 w 的计算公式重新推导 2误差表也发生了变化需要得新计算 ①推导 w 计算式 1 用前面的算法算出 0年3月1日是星期3 前7天, d 1---7 w 3----2 得到 w (d2) % 7 此式同样适用于整个三月份 2 扩展到每一年的三月份 [d 2 y (y-1)/4 - (y-1)/100 (y-1)/400] % 7 ②误差表  月 误差 累计 模7 3 3 0 0 4 2 3 3 5 3 5 5 6 2 8 1 7 3 10 3 8 3 13 6 9 2 16 2 10 3 18 4 11 2 21 0 12 3 23 2 13 3 26 5 14 - 29 1  ③得到扩展到其它月的公式 e[] {0,3,5,1,3,6,2,4,0,2,5,1} w [d2 e[m-3] y(y-1)/4-(y-1)/100(y-1)/400] % 7 (3 m 14) 我们还是将 y-1 的式子进行简化 w [d2 e[m-3] yy/4-y/100y/400] % 7 (3 m 14) 这个式子如果当年是闰年会告成多1的误差 但我们将1,2月变换到上一年的13,14月年份要减1所以这个误差会自动消除所以得到下面的算法 int e[] new int[]{0,3,5,1,3,6,2,4,0,2,5,1}; if(m 3) { m 12; --y; } int w (d2 e[m-3] y(y/4)-y/100y/400) % 7; -----公式⑸ 我们可以看到公式⑸与公式⑷几乎是一样的仅仅是误差天和一个常数的差别 常数的区别是由起始日期的星期不同引起的0年1月1日星期日0年3日1日星期三有三天的差别所以常数也从 -1 变成了 2。 现在我们成功的消除了繁琐的闰年条件判断。  消除误差表  假如存在一种m到e的函数映射关系使得 e[m-3] f(m) 则我们就可以用 f(m) 取代公式⑸中的子项 e[m-3]也就消除了误差表。 由于误差表只有12个项且每一项都可以加减 7n 进行调整这个函数关系是可以拼凑出来的。但是这个过程可能是极其枯燥无味的我现在不想自己去推导它我要利用前人的成果。所谓前人栽树后人乘凉嘛 ) 文章开头开出的公式中的 2*m3*(m1)/5 这个子项引起了我的兴趣 经过多次试试验我运行下面的代码 for(m1; m14; m) System.out.print((-12*m3*(m1)/5)%7 ); System.out.println(); 天哪输出结果与我的误差表不谋而合成功了哈哈 2 4 0 3 5 1 3 6 2 4 0 2 5 1 Press any key to continue... 上面就是输出结果看它后面的12项与我的误差表完全吻合!!! 现在就简单的将 f(m) -1 2*m 3*(m1)/5 代入公式⑸得到 w (d12*m3*(m1)/5y(y/4)-y/100y/400) % 7 ----公式6 约束条件: m1,m2 时 mm12,yy-1; 现在我们得到了通用的计算星期的公式并且“完全”是按自己的思想推导出来的(那个函数映射关系不算)只要理解了这个推导的步骤即使有一天忘记了这个公式也可以重新推导出来! 可能有人会注意到公式⑹与文章开头的公式相差一个常数 1这是因为原公式使用数字0--6表示星期一到星期日而我用0--6表示星期日到星期六。实际上是一样你可以改成任意你喜欢的表示方法只需改变这个常数就可以了。 六、验证公式的正确性。 一个月中的日期是连续的只要有一天对的模7的关系就不会错所以一个月中只须验证一天就可以了一天需要验12天。由于扩展到年和月只跟是否闰年有关系就是说至少要验证一个平年和一个闰年也就是最少得验证24次。 我选择了 2005 年和 2008 年验证每个月的1号。 测试代码如下  class test { public int GetWeek(int y, int m, int d) { if(m3) { m 12; --y; } int w (d12*m3*(m1)/5y(y2)-y/100y/400) % 7; return w; } } public class Week { public static void main(String[] args){ int y 2005; int m 1; int d 1; test t new test(); String week[] new String[]{ 星期日,星期一,星期二,星期三,星期四,星期五,星期六 }; for(y2005; y2008; y3) { for(m1; m12; m) { String str y - m - d \t week[t.GetWeek(y,m,d)]; System.out.println(str); } } } } 查万年历检查程序的输出完全正确。 七、后话 我们这个公式的推导是以0年3月1日为基础的对该日以后的日期都是可以计算的。但是否可以扩展到公元前(1,2已属于公元前1年的13,14月了)呢 虽然我对0年1月和2月、以及公元前1年(令y-1)的12月作了验证是正确的但我在推导这个公式时并未想到将其扩展到公元前所以上面的推导过程没有足够理论依据可以证明其适用于公元前。(负数的取模在不同的编译器如C中好象处理并不完全正确)。 另外一有点是对于0年是否存在的争议一种折中的说法是0年存在但什么也没有发生其持续时间为0。还有在罗马的格利戈里历法中有10天是不存的(1582年10月5日至14持续时间为0)英国的历法中有11天(1752年9月3日至13日)是不存在的。感兴趣的朋友可以看看这里 但是我们做的是数字计算不管那一天是否存在持续的时间是24小时还是23小时甚至是0小时只要那个号码存在就有一个星期与之对应。所以这个公式仍然是适用的。 如果要计算的是时间段就必须考虑这个问题了。 转载于:https://www.cnblogs.com/fengbohello/p/3264300.html
http://www.pierceye.com/news/552073/

相关文章:

  • 柳州集团学校网站建设做美食推广的网站
  • 网站开发 发送邮件功能深圳做分销商城网站
  • 网站备案 取消网上智慧团建官网入口
  • 网站开发 无代码app 外包开发公司
  • 做网站应该用什么配置的手提电脑免费微商城小程序模板
  • 义乌外贸网站建设公司服务外包和劳务外包区别
  • 四川长昕建设工程有限公司网站兰州网站哪里做
  • 电子商务网站规划与管理申请一个域名后怎么做网站
  • 中小企业网站制作方法桂林景区网站策划
  • shopify做全品类网站提交链接
  • 网站建设和运营哪家公司好宠物医疗设计素材网站
  • 泰州网站制作公司中国空间站机械臂
  • 信誉好的常州网站建设网监备案网站更换域名
  • 淮南品牌网站建设电话南昌网站建设q479185700棒
  • 富阳区住房和城乡建设局网站广州市住房保障和房屋管理局
  • 江门建设局网站上海住房和城乡建设部网站
  • 开一个网站需要什么建设商务网站的方案
  • asp.net网站开发 pdf全球互联网中心在哪里
  • 做外贸网站要有域名学什么可以做网站
  • 服装高级定制品牌app排名优化
  • 济南推广网站建设保定seo网络推广
  • 网站运营策略wordpress调用友情链接
  • 网站流量下降原因京津冀协同发展四区指的是
  • 北滘网站设计网站建设应解决的问题
  • 网站建设空间申请wordpress 学校主题
  • 长沙市建设工程质量安全监督站官方网站做网站入门看什么书
  • 网站设计 素材代账行业门户网站开发
  • 旅游公司网站开发与实现如何建立公司网站
  • 专门做金融培训的网站有哪些wordpress注册没反应
  • 网站备案部门建设厅焊工证什么样子