| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5375 人关注过本帖, 2 人收藏
标题:在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超级不 ...
只看楼主 加入收藏
wubihai7
Rank: 2
等 级:论坛游民
帖 子:31
专家分:13
注 册:2010-3-4
结帖率:66.67%
收藏(2)
已结贴  问题点数:2 回复次数:6 
在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天,如何编写
在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的十三日又恰逢星期五就叫“黑色星期五”。
要求:输入年份,输出是:判断该年是否包含黑色星期五,如包含,给出具体日期
#include<stdio.h>
typedef struct
{
  int month;
  int day;
}Data;  
int main()
{
  Data data[10];
  int a[13]={0,12,43,71,102,132,163,193,224,255,285,316,346};
  int b[13]={0,12,43,72,103,133,164,194,225,256,286,317,347};//闰年时
  int n=0,i,year;
  scanf("%d",&year);
  if(((year%4==0)&&(year%100!=0))||(year%400==0))//闰年时
  {
    for(i=1;i<=12;i++)
    {
      if((year*365+(year-1)/4-year/100+year/400+b[i])%7==5)
      {
        data[n].month=i;
        data[n].day=13;
        n++;
      }
    }
  }
  else//平年
  {
    for(i=1;i<=12;i++)
    {
      if((year*365+year/4-year/100+year/400+a[i])%7==5)
      {
        data[n].month=i;
        data[n].day=13;
        n++;
      }
    }
  }   
  if(n==1)
  {
    printf("There is %d Black Friday in year %d.\nIt is:\n",n,year);
    printf("%d/%d/%d\n",year,data[0].month,data[0].day);
  }
  else
  {
    printf("There are %d Black Fridays in year %d.\nThey are:\n",n,year);
    for(i=0;i<n;i++)printf("%d/%d/%d\n",year,data[i].month,data[i].day);
  }
  return 0;
}
红色加粗的语句如何理解

[ 本帖最后由 wubihai7 于 2011-4-19 18:38 编辑 ]
搜索更多相关主题的帖子: 黑色星期五 
2011-04-19 18:36
linw1225
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
帖 子:110
专家分:145
注 册:2011-4-7
收藏
得分:1 
这个我见过,也不懂,求解释。

Einmal ist keinmal
2011-04-19 19:12
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:1 
这个应该不难吧   楼主自己debug一下

                                         
===========深入<----------------->浅出============
2011-04-19 19:16
wubihai7
Rank: 2
等 级:论坛游民
帖 子:31
专家分:13
注 册:2010-3-4
收藏
得分:0 
能不能解析一下啊,万分感激
2011-04-20 00:06
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:1 
红色加粗的语句给出的是 (从元年元月1号到指定年相应月的13号的天数)%7 == 5
即,判断指定年相应月的13号是否为星期五。
觉得你的程序繁琐了一点,修改了一下。
程序代码:
#include<stdio.h>
int main()
{
    int month[12]={0,31,28,31,30,31,30,31,31,30,31,30};
    int sum=0,i,year,m,flag=1;

    scanf("%d",&year);

    m= (year*365 +year/4 - year/100 + year/400 - year/4/400 )%7;
    // 计算出指定年的第一天是星期几

    for(i=0;i<12;i++)
    {
        sum+=month[i];   
        if((flag && ( year%4==0 && year%100!=0 )||(year%400==0))&& i>=2 )//闰年时
        {
            sum++; flag=0;
        }

        if((m+sum+13)%7==5)
            printf("%d/%d/%d\n",year,i+1,13);
    }
   
    return 0;
}

2011-04-20 10:14
machine_of_a
Rank: 2
等 级:论坛游民
帖 子:8
专家分:36
注 册:2011-4-19
收藏
得分:1 
  我们知道,公历的平年是365天,闰年是366天。置闰的方法是能被4整除的年份在2月加一天,但能被100整除的不闰,能被400整除的又闰。 因 此,像1600、2000、2400年都是闰年,而1700、1800、1900、2100年都是平年。公元前1年,按公历也是闰年。

  因此,对于从公元前1年(或公元0年)12月31日到某一日子的年份Y之间的所有整年中的闰年数,就等于

[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400],

[...]表示只取整数部分。第一项表示需要加上被4整除的年份数,第二项表示需要去掉被100整除的年份数,第三项表示需要再加上被400整除的年份数。之所以Y要减一,这样,我们就得到了第一个计算某一天是星期几的公式:

W = (Y-1)*365 + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (1)

其中D是这个日子在这一年中的累积天数。算出来的W就是公元前1年(或公元0年)12月31日到这一天之间的间隔日数。把W用7除,余数是几,这一天就是星期几。比如我们来算2004年5月1日:

W = (2004-1)*365 + [(2004-1)/4] - [(2004-1)/100] + [(2004-1)/400] +31+29+31+30+1)
 = 731702,

731702 / 7 = 104528……6,余数为六,说明这一天是星期六。这和事实是符合的。

程序中的D用查表法做了简化,分了闰年和平年,对照程序,你看一下

2011-04-20 10:51
wubihai7
Rank: 2
等 级:论坛游民
帖 子:31
专家分:13
注 册:2010-3-4
收藏
得分:0 
谢谢
2011-04-20 12:15
快速回复:在西方,星期五和数字 13 都代表着坏运气,两个不幸的个体最后结合成超 ...
数据加载中...
 
   



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

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