蛮力拟合--万年历有关月份天数代码的简化

昨天海燕在网上找了一个万年历的代码,基本思路大体相同,计算得输入月份的天数m和月份的一号是星期i来显示万年历。
奇怪的是,它计算一号是星期几时特别简洁,只有一行代码:

return ((1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;

这个基本思路是每月去掉28,因为28能整除7,年份去掉364,因为364能整除7,但没有条件判断,只有一行,就隐约觉得不行。
闰年的1,2月和3月和平年的是不同的,闰年3月后要相比平年的统一加1,就算你直接用year计算,而不是year-1,当年是闰年可以直接加1,但你的加1是加到整个12月的情况上了,闰年的1、2月是不能加的。
后来验证得:闰年的1、2月不对。
但这种简洁的思路是我需要学习的。他的月份计算1+2month+3(month+1)/5给了我启发。我试着构造a+2month+c(month+d)/5来拟合1到12月的(减去28后)剩余天数的情况,思路是用4层for循环嵌套来蛮力拟合。

#include
int month,sum;
int judge(int a,int b,int q,int w,int e);

void main()
{
   int a,b=2,c,d,i,count,num[12]={2,5,5,8,10,13,15,18,21,23,26,28};
for(a=-10;a<=9;a++)
     {
       for(c=1;c<=9;c++)
              {
                  for(d=1;d<=9;d++)
                    {
                         for(month=1;month<=12;month++)
{ 

      for(i=0;i<=12;i++)
      {
          count+=judge(i,num[i-1],a,c,d);
        }
          if(count==12)
           printf("%d\n%d\n%d\n%d\n",a,b,c,d);
        
}
                     }
int judge(int a ,int b,int q,int w,int e)
{
    month=a;
sum=q+2*a+w*(a+e)/5;
if(sum==b)
return 1;
else
return 0;
}

                  




没有一个结果,想法失败。

你可能感兴趣的:(蛮力拟合--万年历有关月份天数代码的简化)