浅滩


私信TA

用户名:bob2048

访问量:19107

签 名:

人傻就该多读书

等  级
排  名 584
经  验 4282
参赛次数 4
文章发表 32
年  龄 0
在职情况 学生
学  校
专  业 计算机科学与技术

  自我简介:

烦死了

解题思路:之前看了别人写的代码,暴力枚举,枚举数目过多,时间复杂度太高,还有就是有些前辈用了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;
}
2022-01-16 16:50:19
算法整挺好,就是您这代码风格,。。。真是难受
2020-07-16 14:17:22
建议你弄成代码的格式,看的太不舒服了,代码是很好的代码,可是不耐看
2019-01-02 20:53:45
  • «
  • 1
  • »