美文网首页
蛮力拟合--万年历有关月份天数代码的简化

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

作者: b6aed1af4328 | 来源:发表于2016-10-10 22:16 被阅读32次

    昨天海燕在网上找了一个万年历的代码,基本思路大体相同,计算得输入月份的天数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<stdio.h>
    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;
    }
    
                      
    
    
    
    
    

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

    相关文章

      网友评论

          本文标题:蛮力拟合--万年历有关月份天数代码的简化

          本文链接:https://www.haomeiwen.com/subject/ajuvyttx.html