输入一个日期,输出该日期是星期几

假定输入日期合法正确。

先找一个参考日期,找星期天的日期为最好。我一时没想到就选了今天,星期一,也不错。然后求出输入日期与参考日期之间间隔的天数n,n为负时则表示输入日期在参考日期之前,n为正时则表示输入日期在参考日期之后。因为星期为循环星期1到星期天,又根据补码的原理,可知n = ((n % 7) +  8) % 7, 此时的n为几则是星期几。(PS:星期天用0来表示,因为我选的是参考日期是星期一所以是+8,如果选的是星期天则是+7)。

 1 //给定一个日期,求这个日期是星期几?
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4
 5 int is_leap_year(unsigned y);
 6 unsigned days_in_year(unsigned y, unsigned m, unsigned d);
 7 void swap(unsigned *m, unsigned *n);
 8 int days(unsigned y1, unsigned m1, unsigned d1);
 9
10 int main(int argc, char *argv[])
11 {
12     unsigned y, m, d;
13     int n, res;
14
15     while (fflush(stdin),(res = scanf("%d%d%d", &y, &m, &d)) != EOF)
16     {
17         n = days(y, m, d);
18         n %= 7;
19         n = (n + 8) % 7 ;
20         printf("%d年%d月%d日是星期%d\n", y, m, d, n);
21     }
22     system("pause");
23     return 0;
24 }
25
26 int is_leap_year(unsigned y)
27 {
28     if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
29         return 1;
30     else
31         return 0;
32 }
33
34 unsigned days_in_year(unsigned y, unsigned m, unsigned d)
35 {
36     unsigned n = 0, i;
37     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
38
39     if(is_leap_year(y))
40         months[2] = 29;
41     else
42         months[2] = 28;
43     for ( i = 1; i < m; i++)
44         n += months[i];
45     n += d;
46     return n;
47 }
48
49 void swap(unsigned *m, unsigned *n)
50 {
51     unsigned tmp;
52     tmp = *m;
53     *m = *n;
54     *n = tmp;
55 }
56
57 int days(unsigned y2, unsigned m2, unsigned d2)
58 {
59     unsigned y1, m1, d1, i, n = 0;
60     int flag = 0;
61
62     y1 = 2015;
63     m1 = 3;
64     d1 = 9;
65     if ( y1 > y2 || (y1 == y2 && m1 > m2) || (y1 == y2 && m1 == m2 && d1 > d2))
66     {
67         flag = 1;
68         swap(&y1, &y2);
69         swap(&m1, &m2);
70         swap(&d1, &d2);
71     }
72     if (y1 != y2)
73     {
74         if (is_leap_year(y1))
75             n += 366 - days_in_year(y1, m1, d1);
76         else
77             n += 365 - days_in_year(y1, m1, d1);
78         for ( i = y1 + 1; i < y2; i++)
79         {
80             if( is_leap_year(i) )
81                 n += 366;
82             else
83                 n += 365;
84         }
85         n += days_in_year(y2, m2, d2);
86     }
87     else
88         n = days_in_year(y2, m2, d2) - days_in_year(y1, m1, d1);
89     if (flag) n = -n;
90     return n;
91 }
时间: 2024-10-23 02:27:20

输入一个日期,输出该日期是星期几的相关文章

输入年月日,输出该日期是当年的第几天

这首题比较简单,只要判断该年是不是闰年,然后按月加,加到当月再加上的输入的天数即可. 假定输入的日期合法. 1 //给定一个日期,求该日期是该年的多少天? 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main(int argc, char *argv[]) 6 { 7 int y, m, d, n = 0, i, res; 8 int months[13] = {0,31, 28, 31, 30, 31, 30, 31, 3

输入一个n,输出2到n的详细素数值

#include<stdio.h> #include<algorithm> #include<cmath> int judge(int a) { int j; for (j = 2; j <= sqrt(a); j++) { if (a%j == 0) return 1; } return 0; } int main() { int i; for (i = 1; i < 100; i++) { if (judge(i) == 0) printf("

输入一个n,输出2到n的具体素数值

#include<stdio.h> #include<algorithm> #include<cmath> int judge(int a) { int j; for (j = 2; j <= sqrt(a); j++) { if (a%j == 0) return 1; } return 0; } int main() { int i; for (i = 1; i < 100; i++) { if (judge(i) == 0) printf("

求接题目:输入一个字符串输出大小写数字及其他字符的个数并逆序输出

9wwwp0b5mw啥睾约抑汕丶防内肯劝<http://weibo.com/p/230927987600061628162048> rvzxpb9vfd肿氨撩都币涡绰腔脚备<http://weibo.com/p/230927987600585677082624> 18o8arvl2k疽芈孔瞪收抡幻勘特婪<http://weibo.com/p/230927987599767041220608> q4y38xjw2c段斗趁己敲沟钙俜腺甘<http://weibo.co

java实现输入一个时间段,以及相应的星期数,获得这个时间段中这些星期的日期

最近在做毕设,遇到一个问题.对于给定的一个时间段和特定的星期,我需要获得这个时间段中所有的给定星期的日期. 比如,获得从2015-01-01到2015-01-21所有的星期一和星期二的日期. package com.cc.common; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class WeekDayUtil { /** * 输入一个日期的时间段

[华为机试]输入一个正整数,输出2000年1月1日经过该整数天后的日期.

//输入一个正整数,输出2000年1月1日经过该整数天后的日期.已测试,输入值可以为0~1095727 //如,100天后,日期为2000 4 10 #include<stdio.h> #define MAX_YEAR 5000//年数可以从2000一直到4999年. //函数功能:求解第year年共有多少天 int day_in_year(int year) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400

Java日历模型:输入一个日期,控制台显示

1 package com.zhen.calendar; 2 3 import java.text.DateFormat; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; 7 import java.util.GregorianCalendar; 8 import java.util.Scanner; 9 10 /* 11 * 输入一个日期,控制台显示 12 *

输入中文日期输出对应的数字格式的日期

案例:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期 比如:二零一二年十二月月二十一日要转换为2012-12-21.(处理"十" 的问题:1.*月十日:2.*月十三日:3.*月二十三日:4.*月三十日:) 四中情况对"十"的不同翻译.1→10:2→1:3→不翻译:4→0[年部分不 可能出现'十',都出现在了月与日部分.] 测试数据:二零一二年十二月二十一日(2012年12月21日).二零零九年七 月九日.二零一零年十月二十四日.二零一零年十月二十日

递归【输入一个日期】返回【前12个月每月最后一天】

/// <summary> /// 递归[输入一个日期]返回[前12个月每月最后一天] /// </summary> /// <param name="date">输入日期</param> /// <param name="i">循环次数(0-11)</param> /// <returns></returns> ArrayList arr = new ArrayList