解题思路:之前看了别人写的代码,暴力枚举,枚举数目过多,时间复杂度太高,还有就是有些前辈用了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语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:1516 |
【偶数求和】 (C++代码)浏览:785 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:746 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:502 |
字符串输入输出函数 (Java代码)浏览:1498 |
【亲和数】 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:1071 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
C语言训练-亲密数 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:727 |