第三十九讲项目六——回文日

程序代码

#include <stdio.h>
#include <stdlib.h>
/*
*csdn学院--2017级
*目的:让代码见证成长(作为一个初学的菜鸟,如
*大家有发现错误,欢迎指正!)
*文件名称:Myfun85.c
*作者:小臣小仁
*完成日期:2017年1月8日
*问题描述::2011年11月02日是一个回文日:2011 1102,
*在2011级同学做这道题时我们刚刚度过这一天!请列出本
*世纪还有多少个回文日(假如我们能活到百岁,你和我的……)。
*注意:一年只有12个月。
*/
int main()
{
    int i=0,j,a,b,c;
    int num,day,year;
    for(year=2011;year<2111;year++)
    {
        for(j=1;j<=12;j++)
        {
            switch(j)
            {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                a=31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                a=30;
                break;
            case 2:
                if((year%4==0&&year%100!=0)||year%400==0)
                    a=28;
                else
                    a=29;
                break;
            }
            for(day=1;day<=a;day++)
            {
                num=year*10000+j*100+day;
                b=num;
                c=0;
                while(b>0)
                 {
                   c=c*10+b%10;
                   b/=10;
                 }
             if(num==c)
             {
                 printf(" %d",c);
                 i++;
                 if(i%4==0)
                    printf("\n");
             }
           }
        }
    }
    return 0;
}

输出结果

心得体会

              通过三个for循环和一个switsh实现的,算是用到了穷举法,把每个数都反序输出,判断是否对等,然后输出

知识点总结

              可能我的程序质量并不是太高,下面附上贺老师的程序供各位参考下:

#include <stdio.h>
int main()
{
    int year,month,day,y,ymd;
    int is_cycle;   //用于标识判断结果:为0时不构成回文日,不为0时,构成回文日
    int count=0;
    for(year = 2015; year < 2100; year++)
    {
                        y = year;  //思考:后面直接用year不行吗?
        month=y%100; //原年份的后两位对应月
         month=(month%10)*10+month/10;//还得把月倒过来,例year=2015时,month由15换为51   
        day=y/100; //原年份的前两位对应日
        day=(day%10)*10+day/10;//对日做同样的处理
        is_cycle = 0;
        switch(month) //12个月份,各自对应合法的日期范围
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            if(day<=31)
                is_cycle =1;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            if(day<=30)
                is_cycle=1;
            break;
        case 2:
            if((year%4==0&&year%100!=0)||year%400==0) //闰年
            {
                if(day<=29)
                    is_cycle = 1;
            }
            else
            {
                if(day<=28)
                    is_cycle =1;
            }
            break;
        default:
            continue; //后两位倒过来根本构不成月份
        }
        if(is_cycle) //能构成回文日
        {
            y=year;
            ymd=year;   //构造出年月日的形式供输出
            while(y>0)
            {
                ymd=ymd*10+y%10;
                y=y/10;
            }
            printf("%d\n", ymd);
            count++;
        }
    }
    printf("共有 %d 个回文日。\n", count);
    printf("\n");
    return 0;
}
希望给大家带来不一样的思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值