| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6237 人关注过本帖
标题:关于黑色星期5的思路
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 9楼 beyondyf
就楼主的题目来说 不使用公式算 就得选个基准日期 比如1998年1月1日是星期X

然后顺着天数往下推  貌似也可以

DO IT YOURSELF !
2016-01-27 16:55
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 11楼 wp231957
本质上一样,必须要有一个基准。只不过蔡勒公式中加入了些数论技巧。

重剑无锋,大巧不工
2016-01-27 17:07
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
回复 2楼 beyondyf
它这个规定1998年1月1号为星期四,比如就输入1998 1998平年为365天  这个对天数求余怎么判断是星期几
2016-01-27 17:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
第一次使用dev c++  感觉很别扭
程序代码:
#include <stdio.h>

//获取公历年初至某整月的天数
int year_sumday(int year,int month)
{
    int sum=0;
    int rui[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int ping[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int ruiflag=0;
    if((year%4==0 &&year%100!=0) || year%400==0) ruiflag=1;
    for(int index=0;index<month-1;index++)
    {
        if(ruiflag==1) sum+=rui[index];else sum+=ping[index];
    }
    return sum;
}
//获取公历年的天数
int year_alldays(int year)
{
    if((year%4==0 && year%100!=0) || year%400==0) return 366; else return 365;
}

//获取从公历1975年1月1日至当前日期的总天数
int get_g_alldays(int year,int month,int day)
{
    int i=1975,days=0;
    while(i<year)
    {
        days+=year_alldays(i);
        i++;
    }
    int days2=year_sumday(year,month);
    return days+days2+day;
}

int main(int argc, char** argv)
{
    int winit=3;   //初始化星期三  1975.01.01
    int days=0;
    int smonth;
    int _week;
    int syear=2015;
    int sday=13;
    for(smonth=1;smonth<=12;smonth++)
    {
        days=get_g_alldays(syear,smonth,sday);
        _week=(days % 7 + winit-1)%7;
        if(_week==5) printf("%d年%d月%d日是黑色的星期五\n",syear,smonth,sday);
    }
    return 0;
}



DO IT YOURSELF !
2016-01-27 20:55
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
如果用蔡勒公式 会相对简单一些
程序代码:
#include <stdio.h>

//利用蔡勒公式计算星期几
//w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
int getweek(int year,int month,int day)
{
    int w;    //星期
    int c;    //世纪-1 YYYY的头两位
    int y;    //年份   YYYY的后两位
    int m;    //月份 >=3 1月 2月看成上年的13月 14月
    int d=day;    //
    if(month>=3)
    {
        c=year / 100;
        y=year % 100;
        m=month;
    }
    else
    {
        m=month+12;
        y=(year-1) % 100;
        c=(year-1) / 100;
    }
    w=y+y/4+c/4-2*c+(26*(m+1))/10+d-1;
    w%=7;
    return w;
}

int main(int argc, char** argv)
{
    int smonth;
    int _week;
    int syear=2015;
    int sday=13;
    for(smonth=1;smonth<=12;smonth++)
    {
        _week=getweek(syear,smonth,sday);
        if(_week==5) printf("%d年%d月%d日是黑色的星期五\n",syear,smonth,sday);
    }
    return 0;
}



DO IT YOURSELF !
2016-01-27 20:59
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
万哥没理解我的意思,看看我的代码如何。直接实现题目要求。
程序代码:
#include<stdio.h>

int getWeek(int year, int month, int day)
{
    const int c[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    int s;
    s = c[month] + day + ((year % 4 == 0 && year % 100 || year % 400 == 0) && month > 2);
    year--;
    s += year * 365 + year / 4 - year / 100 + year / 400;
    return s % 7;
}

int cal(int year)
{
    int i, c;
    for(c = 0, i = 1; i <= 12; c += getWeek(year, i++, 13) == 5);
    return c;

 }

int main()
{
    int y;
    scanf("%d", &y);
    printf("%d", cal(y));
    return 0;
}

重剑无锋,大巧不工
2016-01-27 21:27
不同认为
Rank: 1
等 级:新手上路
帖 子:93
专家分:3
注 册:2015-11-25
收藏
得分:0 
没看懂两位的代码  有个网上看的代码是这样的
#include <stdio.h>

int getWeekOfFirstDay(int year)
{
    //已知1998年1月1日是星期四
    int i=1998,week=3;
    int days=0;
   
    for(i=1998;i<year;i++)
    {
        if(i%400==0||(i%4==0&&i%100!=0))
        days+=366;
        else
        days+=365;
    }
   
    return (days+week)%7;
}

void printBlackFridayTimes(int year)
{
    int day[2][12]={{31,28,31,30,31,30,31,31,30,31,30},{31,29,31,30,31,30,31,31,30,31,30}};
    int week=getWeekOfFirstDay(year),flag=year%400==0||(year%4==0&&year%100!=0)?1:0;
    int times=0,i,days=0;
   
    //遍历12个月
    for(i=0;i<12;i++)
    {
        //判断每个月13号是否是黑色星期五
        if((days+12+week)%7==4)
        times++;
        
        days+=day[flag][i];
    }
   
    printf("%d\n",times);
    return ;
}

main()
{
    int year;

    scanf("%d",&year);
    printBlackFridayTimes(year);
   
    return 0;
}
 getWeekOfFirstDa函数里的week为什么要等于3  返回值为什么是(days+week)%7, 还有这个 if((days+12+week)%7==4)判断是不是黑色星期五这个式子是怎么推出来的
     
2016-01-27 22:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用beyondyf在2016-1-27 21:27:06的发言:

万哥没理解我的意思,看看我的代码如何。直接实现题目要求。



我没有看出来太大的区别啊  只不过我不是按照楼主的要求去解题  而你的代码比较精炼  其他的没看出来啊

DO IT YOURSELF !
2016-01-28 15:18
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
至于17楼的  不是很理解  我们的代码你不问 你却来问一个不是我们写的代码  

日期类的实际应用也就大致都是如此的  尤其是推算星期的  很easy 要是加推算农历就很麻烦了

DO IT YOURSELF !
2016-01-28 15:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
回复 18楼 wp231957
大概是我没表达清楚。我的算法本质等同于万哥的第一段代码。虽然效率上与蔡勒公式相仿,但原理完全不同。

它仍是直接计算以公元元年为基准的当前日期天数然后模7。只不过没有一年一年的累加,而是通过一次乘法运算、三次除法运算直接得出。

忽略加法运算与逻辑运算,对比我和蔡勒公式的效率差别。

我的算法使用了1次乘法运算、7次除法运算(取模等同于除法),而蔡勒公式用了2次乘法运算、6次除法运算。蔡勒公式总体要比我的算法效率更高一点。


重剑无锋,大巧不工
2016-01-28 18:35
快速回复:关于黑色星期5的思路
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved