用c语言确定某一年一月一日是星期几

如题所述

1900年1月1日为星期一:
#include<stdio.h>

int test(int year) {//闰年返回1

    if((year%400==0)||(year%4==0&&year%100!=0))  return 1;

   return 0;

}  

   void main(){

  int  year,i;

  long  sum=0;// 计算1900到你输进的年的总天数 

 printf("\nInput year(year>=1900):");

  scanf("%d",&year);        

  for(i=1900;i<year;i++){

    sum+=365 ;

    if(test(year)==1) sum+=1; 

  } 

  printf("\n%d-1-1: ",year);

  int fg=sum%7; 

  switch(fg) {

   case 0: printf("星期一"); break;

   case 1:printf("星期二"); break;

   case 2:printf("星期三"); break;

   case 3:printf("星期四"); break;   

   case 4:printf("星期五" ); break;

   case 5:printf("星期六"); break;

   case 6:printf("星期日"); break;

}

  printf("\n\n\t");

}   
//测试通过,望采纳

追问

如果输入的年份在1900以前呢?

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-30
#include <stdio.h> 
int dysforcompeleteyears(int startyear,int endyear){   //星期几
int sum=0;
for(int i=startyear;i<endyear;i++)
if(i%400==0||i%4==0&&i%100!=0)
sum+=366;
else
sum+=365;
return sum;
}
int daysforcurrentyear(int year,int month,int day){
int ss[13]={31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<month-1;i++)
day+=ss[i];
if((year%400==0||(year%4==0&&year%100!=0))&&month>2)
day++;
return day;
}
int main(){
int year,month,day;
scanf("%d-%d-%d",&year,&month,&day);  
int sum=0;
sum+=dysforcompeleteyears(1900,year);
sum+=daysforcurrentyear(year,month,day);
sum%=7;
if(sum==0)
printf("星期日\n");
else
printf("星期%d\n",sum);
return 0;

}

//输入格式 如:2014-5-17   这样输入才是对的 

追问

你这个也是以1900年作基准的吗?如果输入年份在1900以前怎么办呢?

追答#include <stdio.h> 
int dysforcompeleteyears(int startyear,int endyear){   //星期几
    int sum=0;
    for(int i=startyear;i<endyear;i++)
        if(i%400==0||i%4==0&&i%100!=0)
            sum+=366;
        else
            sum+=365;
    return sum;
}
int daysforcurrentyear(int year,int month,int day){
    int ss[13]={31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i=0;i<month-1;i++)
        day+=ss[i];
    if((year%400==0||(year%4==0&&year%100!=0))&&month>2)
        day++;
    return day;
}
int main(){
    int year,month,day;
while(1){
    scanf("%d-%d-%d",&year,&month,&day);  
    int sum=0;
    sum+=dysforcompeleteyears(1,year);
    sum+=daysforcurrentyear(year,month,day);
    sum%=7;
    if(sum==0)
        printf("星期日\n");
    else
        printf("星期%d\n",sum);

}
return 0;
}

修改好了,,公元后的任何日期都行,,输入方式2014-5-18

while(1){} 是为了方便测试,如果你不需要可以删除 

本回答被提问者采纳
第2个回答  2017-10-19
第四周编程作业第题确定母亲节
2
确定母亲节(10分)
题目内容:
母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。

输入格式:

年份

输出格式:

日期(5月的哪一天)

输入样例:

2014

输出样例:

11

时间限制:500ms内存限制:32000kb
这道题目网上有两种方法,都可以通过,第一种方法

#include<stdio.h>
int main()
{
int year, n, week, total, day;
scanf("%d",&year);
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;
for(n = 0;n < 5; n++)
{
if(n == 0) total = 0;
if(n == 1 || n == 3) total += 31;
if(n == 2) total += 29;
if(n == 4) total += 30;
}
}
else
{
week = (year + year / 4 + year / 400 - year / 100) % 7;
for(n = 0; n < 5; n++)
{
if(n == 0) total = 0;
if(n == 1 || n == 3) total += 31;
if(n == 2) total += 28;
if(n == 4) total += 30;
}
}
week = (week + total) % 7;
if (week == 0) week = 7;
day = 7 - week + 8;
printf("%d\n",day);
return 0;
}
//程序里语句 week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;
//及week = (week + total) % 7;
// day = 7 - week + 8;
//这三条语句应该如何理解?

第二种方法

#include <stdio.h> int main()
{int year,b,n;
scanf("%d",&year);
b=(year-1720)%28;
switch(b)
{case 0:n=14;break;case 1:n=13;break;case 2:n=12;break;case 3:n=11;break;case 4:n=9;break;case 5:n=8;break;case 6:n=14;break;case 7:n=13;break;case 8:n=11;break;case 9:n=10;break;case 10:n=9;break;case 11:n=8;break;case 12:n=13;break;case 13:n=12;break;case 14:n=11;break;case 15:n=10;break;case 16:n=8;break;case 17:n=14;break;case 18:n=13;break;case 19:n=12;break;case 20:n=10;break;case 21:n=9;break;case 22:n=8;break;case 23:n=14;break;case 24:n=12;break;case 25:n=11;break;case 26:n=10;break;case 27:n=9;break;
}
printf("%d\n",n);return 0;
}
//程序中语句b=(year-1720)%28; 应该如何理解?

第三题
计算星期(10分)
题目内容:
给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。

输入格式:

年 月 日

输出格式:

0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?

输入样例:

2013 3 11
输出样例:

1

输入样例:

2013 13 15
输出样例:

month is error.

输入样例:

2013 3 32
输出样例:

day is error.
测试代码完全通过

#include <stdio.h>
int dysforcompeleteyears(int startyear,int endyear){ //星期几
int sum=0;
for(int i=startyear;i<endyear;i++)
if(i%400==0||i%4==0&&i%100!=0)
sum+=366;
else
sum+=365;
return sum;
}
int daysforcurrentyear(int year,int month,int day){
int ss[13]={31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<month-1;i++)
day+=ss[i];
if((year%400==0||(year%4==0&&year%100!=0))&&month>2)
day++;
return day;
}
int main(){
int year,month,day;
scanf("%d%d%d",&year,&month,&day);
if(year <= 1900 ){
printf("year is error.\n");
return 0;
}
if(month >= 13 || month < 1){
printf("month is error.\n");
return 0;
}
if(day < 0){
printf("day is error.\n");
return 0;
}
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(day > 31){
printf("day is error.\n");
return 0;
}
break;
case 4:
case 6:
case 9:
case 11:
if(day > 30){
printf("day is error.\n");
return 0;
}
break;
case 2:
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
if(day > 29){
printf("day is error.\n");
return 0;
}
}
else{
if(day > 28){
printf("day is error.\n");
return 0;
}
}
break;
}
int sum=0;
sum+=dysforcompeleteyears(1900,year);
sum+=daysforcurrentyear(year,month,day);
sum%=7;
if(sum==0)
printf("0\n");
else
printf("%d\n",sum);
return 0;
}

测试代码只是依据1900年1月1日为星期一,当然也可依据公元元年1月1日(即1年1月1日)为星期一件题目要求的1900年扩充至公元后的任何日期,说明第二题确定母亲代码的疑问均属于公式,有大神有公式的推导证明分享下,吾等必将感激不尽
第3个回答  2014-05-17
#include <string.h>
#include <time.h>
int get_week(int);
int get_week(int year)
{
struct tm tm;
if (year < 1970 || year>3000)return -1;
memset(&tm, 0, sizeof tm);
tm.tm_year = year - 1900;
tm.tm_mday = 1;
mktime(&tm);
return tm.tm_wday;
}

星期日为0,星期一--星期六为1--6
相似回答