解题思路:之前看了别人写的代码,暴力枚举,枚举数目过多,时间复杂度太高,还有就是有些前辈用了n*n*n的时间复杂度完成了任务虽然比暴力枚举好一些但是我认为还是可以再进行优化的,下面是我优化过的代码,我只用了两个嵌套的循环就ok了,

注意事项:有什么问题欢迎留言讨论,已经在系统通过了

判断回文:本题是5位或者6位

5位的例子:12321,你会发现只需要知道123你就可以算出这个回文数字的和了(1+2)*2+3

6位的例子:123321,你会发现只需要知道123你就可以算出这个回文数字的和了(1+2+3)*2

所以只需要用三重循环就可以做到,优化后两重循环就可以做到
参考代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() 
{int n,flag=0,i,j,k; 
 scanf("%d",&n);
 for(i=1;i<=9;i++)//回文数是5位的情况 
 {
 for(j=0;j<=9;j++)
    
{
 for(k=n-2*i-2*j;(k>=0&&k<10);) 
 {
 printf("%d%d%d%d%d\n",i,j,k,j,i);
 flag=1;break;
 }
 }
 }
for(i=1;i<=9;i++)//回文数是6位的情况 
 {
 for(j=0;j<=9;j++) 
 {
 for(k=n-2*i-2*j;((k%2==0&&k/2<10)&&k/2>=0);) 
 {
 printf("%d%d%d%d%d%d\n",i,j,k/2,k/2,j,i);
 flag=1;break;
 }
 }
 }
 if(flag==0)printf("-1\n");
 }


点赞(2)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

Apologize 3年前 回复TA
#include<stdio.h>
int main()
{
    int n,flag=1;
    scanf("%d",&n);
    int i,j,k;
    for(i=1;i<=9;i++)
        for(j=0;j<=9;j++){
            k=n-2*i-2*j;
            if((k>=0)&&(k<10))
            {
                flag=0;
                printf("%d%d%d%d%d\n",i,j,k,j,i);
            }
        }
    for(i=1;i<=9;i++)
        for(j=0;j<=9;j++){
            k=n-2*i-2*j;
            if((k%2==0)&&(k/2>=0)&&(k/2<10))
                {
                flag=0;
                printf("%d%d%d%d%d%d\n",i,j,k/2,k/2,j,i);
            }
        }
        if(flag) printf("-1");
    return 0;
}
澄澈i 4年前 回复TA
算法整挺好,就是您这代码风格,。。。真是难受
学c也学python 5年前 回复TA
@c晨光 都差不多,算法是一样的
c晨光 6年前 回复TA
建议你弄成代码的格式,看的太不舒服了,代码是很好的代码,可是不耐看