完全对称日

列出自纪元以来,出现过多少次世界完全对称日。

代码

#include <stdio.h>
int main()
{
    int y,m,d,t,c=0;
    for(y=1;y<=2020;y++)
        for(m=1;m<=12;m++)
        {
            if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                t=31;
            else if(m==4||m==6||m==9||m==11)
                t=30;
            else if(m==2&&y%4==0&&y%100!=0)
                t=29;
            else
                t=28;
            for(d=1;d<=t;d++)
                c+=panduan(y,m,d);
        }
    printf("自纪元以来,出现过%d次世界完全对称日",c);
    return 0;
}
int panduan(int y,int m,int d)
{
    int i,zong,s[8];
    zong=y*10000+m*100+d;
    for(i=0;i<8;i++)
    {
        s[i]=zong%10;
        zong=zong/10;
    }
    if(s[7]==0&&s[6]==0&&s[5]==0)
    {
        for(i=0;i<2;i++)
        {
            if(s[i]!=s[4-i])
                return 0;
        }
    }
    else if(s[7]==0&&s[6]==0)
    {
        for(i=0;i<3;i++)
        {
            if(s[i]!=s[5-i])
                return 0;
        }
    }
    else if(s[7]==0)
    {
        for(i=0;i<3;i++)
            if(s[i]!=s[6-i])
                return 0;
    }
    else
    {
        for(i=0;i<4;i++)
            if(s[i]!=s[7-i])
                return 0;
    }
    return 1;
}

运行
在这里插入图片描述
听了大佬的讲解,与同学交流后又出现了新的方法,很感谢。
总结
写这种代码要注意多种情况的出现,优先对算法过程简化。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 根据题目要求,美好子是一个共8位数字的完全对称,年份占4位,月份、份都是2位。因此,我们可以先判断该年份是否符合要求,即是否是4位数字。如果不是,则该年份不存在美好子。如果是4位数字,则需要判断该年份中是否存在美好子。 判断该年份中是否存在美好子,可以通过循环遍历该年份中的所有期,判断每个期是否符合要求。具体来说,可以从1月1开始,依次遍历到12月31,对于每个期,判断其是否是一个完全对称。如果存在一个完全对称,则该年份存在美好子;否则,该年份不存在美好子。 需要注意的是,判断一个期是否是完全对称,可以将该期转换为字符串,然后判断其是否与其反转后的字符串相等即可。例如,对于期20211202,其反转后的字符串为20211202,因此该期是一个完全对称。 综上所述,判断一个年份是否存在美好子的算法如下: 1. 判断该年份是否是4位数字,如果不是,则该年份不存在美好子,直接返回false。 2. 循环遍历该年份中的所有期,对于每个期,判断其是否是一个完全对称。 3. 如果存在一个完全对称,则该年份存在美好子,返回true;否则,该年份不存在美好子,返回false。 代码实现如下: def is_beautiful_day(year): # 判断年份是否是4位数字 if len(str(year)) != 4: return False # 循环遍历该年份中的所有期 for month in range(1, 13): for day in range(1, 32): # 判断期是否合法 if month in [4, 6, 9, 11] and day == 31: continue elif month == 2 and day > 29: continue elif month == 2 and day == 29 and not is_leap_year(year): continue # 将期转换为字符串 date_str = str(year) + str(month).zfill(2) + str(day).zfill(2) # 判断期是否是完全对称 if date_str == date_str[::-1]: return True # 不存在完全对称 return False def is_leap_year(year): # 判断是否是闰年 if year % 4 == and year % 100 != or year % 400 == : return True else: return False # 测试代码 print(is_beautiful_day(2021)) # False print(is_beautiful_day(2022)) # False print(is_beautiful_day(2023)) # False print(is_beautiful_day(2024)) # True print(is_beautiful_day(2025)) # False ### 回答2: 2021年12月2被认为是一个美好子,因为期20211202是一个完全对称的八位数字。这种期在我们的历中出现的频率非常罕见,因此人们视其为特殊的子。 对于给定的年份,我们需要判断该年是否有美好子。我们可以列出每个月份与份的组合,然后确定其中有多少个组合是完全对称的。 年份占4位,因此,一年中可能有以下情况: 1. 类似于2021年12月02这样的8位期; 2. 与第一种情况类似,但年份不同; 3. 与第一种情况类似,但月份与份交换; 4. 与第三种情况类似,但年份不同。 第一种情况只有1天,而第二、三、四种情况则有12天(1月1、2月2、3月3等)。因此,对于任何一年,一共有37个期是美好的。 因此,如果给定的年份中有任意一个期符合美好子的条件,那么该年就拥有美好子。如果没有,那么该年就没有美好子。 总之,美好子是一天特殊的子,由共8位数字的完全对称组成。在计算特定年份是否有美好子时,我们需要了解该年份中是否有任何符合条件的期。 ### 回答3: 在给定年份中,需要枚举每一个月份和期的组合,看是否存在对称。对于月份和期,我们可以将它们转化为字符串形式,然后判断字符串形式下的倒序是否和原串相同即可。下面是关于判断一个年份是否存在美好子的具体流程: 1.输入待判断的年份 y 2.设置标志位 flag = 0 3.枚举月份 m,m 的取值为 [1, 12] 4.枚举期 d,d 的取值为 [1, 31] 5.判断 (10 <= d <= 31 and m in {1, 3, 5, 7, 8, 10, 12}) 或 (10 <= d <= 30 and m in {4, 6, 9, 11}) 或 (m == 2 and (d <= 29 if y % 4 == 0 and y % 100 != 0 or y % 400 == 0 else d <= 28)) 是否成立,如果不成立则跳过该 (m, d) 的组合 6.将月份和期转化为字符串形式并倒序,判断其是否和直接转化为字符串后的结果相等,如果相等则输出 y, m, d,并将 flag 置为 1 7.如果 flag 仍然为 0,则输出不存在美好子的消息 完整的代码实现如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值