解题思路:之前看了别人写的代码,暴力枚举,枚举数目过多,时间复杂度太高,还有就是有些前辈用了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"); }
0.0分
8 人评分
#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; }
川哥的吩咐 (C++代码)浏览:1016 |
高精度加法 (C++代码)(大数加法)浏览:933 |
C二级辅导-公约公倍 (C语言代码)浏览:1509 |
C语言训练-求具有abcd=(ab+cd)2性质的四位数 (C语言代码)浏览:567 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:566 |
【计算直线的交点数】 (C语言代码)浏览:1450 |
1011题解浏览:765 |
Tom数 (C语言代码)浏览:555 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:459 |
简单的a+b (C语言代码)浏览:466 |