【每天例题】蓝桥杯 C语言 回文日期
回文日期
题目
https://www.lanqiao.cn/problems/498/learning/?page=1&first_category_id=1&sort=students_count
题目要求
1.该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
2.日期合法且为八位数。
思路分析
1.我们可以调用三个函数,第一个函数进行日期合法判断,第二个函数进行回文数判断,第三个函数进行特殊型判断
2.当三个函数结果都为1时满足要求
代码1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <stdio.h> #include <stdlib.h> int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 }; int c( int num) //日期是否合法 { int year = num/10000; int month = num%10000/100; int day = num%100; if (month==0||month>12) { return 0; } if (month!=2) { if (day==0||day>days[month]) { return 0; } } else { int l=year%400==0||(year%4==0&&year%100!=0); if (day==0||day>days[month]+l) { return 0; } } return 1; } int c1( int num) //检查回文 { if (num/10000000!=num%10) { return 0; } num%=10000000; if (num/1000000!=num%100/10) { return 0; } num%=1000000; if (num/100000!=num%1000/100) { return 0; } num%=100000; if (num/10000!=num%10000/1000) { return 0; } return 1; } int c2( int num) //检查ABABBABA回文 { int a1,a2,a3,a4,a5,a6,a7,a8; a1=num/10000000; a2=num%10000000/1000000; a3=num%1000000/100000; a4=num%100000/10000; a5=num%10000/1000; a6=num%1000/100; a7=num%100/10; a8=num%10; if (a1!=a3||a1!=a6||a1!=a8) { return 0; } if (a2!=a4||a2!=a5||a2!=a7) { return 0; } return 1; } int main( int argc, char *argv[]) { int n,a1,a2; scanf( "%d" ,&n); for ( int i=n+1; i<=99991231; i++) { if (c1(i)==1&&c(i)==1) { a1=i; break ; } } for ( int i=n+1; i<=99991231; i++) { if (c2(i)==1&&c(i)==1) { a2=i; break ; } } printf( "%d\n%d" ,a1,a2); return 0; } |
代码2(由于没有合适的条件使得回文数日期与ABABBABA型日期区分开,故本条思路进行不下去,如果寻找到合适的条件,则可以直接使用switch-case即可)
该代码尝试将两个特殊型回文数代码缩短,但是如何让while停止在需要的位置是一个难点,当出现不符合日期判断或者符合回文数,该如何让他调到i++,并不进行满足的回文数代码呢?即当该数不符合日期判断,我应该使他跳到最后一步i++,当日期符合回文数n1,那下一个i++则不应该去进行n1的回文数判断,应该去到回文数n2进行判断。类似于满足case 0的语句输出后,后面的i++会直接去寻找满足case 1的语句,但是没有足够的条件去区分开case 0与case 1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<stdio.h> int main() { int common[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 }; //平年 int leap[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 }; //闰年 int year,month,day; int n; int n1,n2; scanf ( "%d" ,&n); int i=n; while (i>89991231) { year=i/10000; month=i%10000/100; day=i%100; if (month==0||month>12) //判断日期是否合法 { goto end; } if (month!=2) { if (day==0||day>common[month]) { goto end; } } else { if ((year%400==0)||(year%4==0&&year%100!=0)); { if (day==0||day>leap[month]) { goto end; } } } int a1,a2,a3,a4,a5,a6,a7,a8; //分别对应第一位到第八位 a1=i/10000000; a2=i%10000000/1000000; a3=i%1000000/100000; a4=i%100000/10000; a5=i%10000/1000; a6=i%1000/100; a7=i%100/10; a8=i%10; <strong> /*问题出在以下部分,没有准确的条件区分开回文数if与ABABBABA型if,导致满足其中一个if输出后,后面的i++依旧会两个if一起判定*/ </strong> if ((a1==a8)&&(a2==a7)&&(a3==a6)&&(a4==a5)) { n1=i; printf( "%d" ,n1); goto end; } if (((a1==a3)&&(a1==a6)&&(a1==a8))&&((a2==a4)&&(a2==a5)&&(a2==a7))) { n2=i; printf( "%d" ,n2); goto end; } end:i++; } return 0; } |
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现