第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数

简介: 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数


前言

       最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是dp分析能力了,所以就主要目标定在这里,最近的题目会很散,很多,基本上都是网罗全网的一些dp练习题进行二次训练,准备比赛的学生底子薄的先不建议看啊,当然,脑子快的例外,可以直接跳过之前的一切直接来看即可,只需要你在高中的时候数学成绩还可以那就没啥问题,其实,dp就是规律总结,我们只需要推导出对应题目的数学规律就可以直接操作,可能是一维数组,也可能是二维数组,总体来看二维数组的较多,但是如果能降为的话建议降为,因为如果降为起来你看看时间复杂度就知道咋回事了,那么在这里祝大家能无序的各种看明白,争取能帮助到大家。


基础练习 特殊回文数

资源限制

内存限制:512.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  123321是一个非常特殊的数,它从左边读和从右边读是一样的。

  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

  输入一行,包含一个正整数n。

输出格式

  按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

52

样例输出

899998

989989

998899

数据规模和约定

1<=n<=54

题解,这个题其实非常的好理解,就是完全对称,并且这个完全对称的各个位数之和加起来等于给定的这个数字。

C语言

暴力的不可思议

#include<stdio.h>
int main()
{
  int a,b,c,d,e,f,t,all;
  scanf("%d",&t);
  for(a=1;a<10;a++)
    for(b=0;b<10;b++)
      for(c=0;c<10;c++)
        for(d=0;d<10;d++)
          for(e=0;e<10;e++)
          {
            if(a==e)
              if(b==d)
                {
                  all=a+b+c+d+e;
                  if(all==t)
                  printf("%d\n",a*10000+b*1000+c*100+d*10+e);
                }
          }
  for(a=1;a<10;a++)
    for(b=0;b<10;b++)
      for(c=0;c<10;c++)
        for(d=0;d<10;d++)
          for(e=0;e<10;e++)
            for(f=0;f<10;f++)
            {
              if(a==f)
                if(b==e)
                  if(c==d)
                  {
                    all=a+b+c+d+e+f;
                    if(all==t)
                      printf("%d\n",a*100000+b*10000+c*1000+d*100+e*10+f);
                  }
            }
          
  return 0;
}

C++语言

相对平和的暴力一下。

#include <iostream>
using namespace std;
int main()
{
  int n,a,b,c,t;
  cin>>n;
  for(a=1;a<10;a++)
  for(b=0;b<10;b++)
  for(c=0;c<10;c++)
  {
    t=a*10001+b*1010+c*100;
    if(2*a+2*b+c==n)
      cout<<t<<endl;  
  }
  for(a=1;a<10;a++)
  for(b=0;b<10;b++)
  for(c=0;c<10;c++)
  {
    t=a*100001+b*10010+c*1100;
    if(2*a+2*b+2*c==n)
      cout<<t<<endl;  
  }
  return 0;
}

Java语言

这个题解的比较复杂,并且我们可以看到很多的不太熟悉的函数,这个能保障输出的速度,先将结果存储到缓存中,最后一起输出。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main
{
  public static InputReader in=new InputReader(System.in);
  public static PrintWriter out =new PrintWriter(new OutputStreamWriter(System.out));
  public static void main(String[] args) throws IOException
  {
    //Queue<Integer> q = new PriorityQueue<>(cmp);
    //char aa[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    while(in.hasNext())
    {
      int n=in.nextInt();
      for (int i = 1; i <=9; i++)
      {
        int a=i*2;
        for (int j = 0; j <=9; j++)
        {
          int b=a+j*2;
          for (int j2 = 0; j2 <=9; j2++)
          {
            int c=b+j2;
            if (c==n)
            {
              System.out.println(i+""+j+""+j2+""+j+""+i);
            }
            
          }
        }
      }
      for (int i = 1; i <=9; i++)
      {
        int a=i*2;
        for (int j = 0; j <=9; j++)
        {
          int b=a+j*2;
          for (int j2 = 0; j2 <=9; j2++)
          {
            int c=b+j2*2;
            if (c==n)
            {
              System.out.println(i+""+j+""+j2+""+j2+""+j+""+i);
            }
          }
        }
      }
    }
    
  }
  static Comparator<Integer> cmp = new Comparator<Integer>() {
        public int compare(Integer e1, Integer e2) {
          return e2 - e1;
        }
      };
  public static class InputReader
  {
    private BufferedReader in;
    private StringTokenizer  Tokenizer;
    public InputReader(InputStream stream)
    {
      in=new BufferedReader(new InputStreamReader(stream),32768);
      Tokenizer=null;
    }
    public String next() throws IOException
    {
      while(Tokenizer==null || !Tokenizer.hasMoreTokens())
      {
        Tokenizer=new StringTokenizer(in.readLine());
      }
      return Tokenizer.nextToken();
    }
    
    public int nextInt()throws IOException
    {
      return Integer.valueOf(next());
    }
    
    public String nextLine()throws IOException
    {
      while(Tokenizer==null || !Tokenizer.hasMoreTokens())
      {
        Tokenizer=new StringTokenizer(in.readLine(),"\n");
        if(!Tokenizer.hasMoreTokens())return "\n";
      }
      return Tokenizer.nextToken();
    }
    public BigDecimal nextBigDecimal()throws IOException
    {
      return new BigDecimal(next());
    }
    
    public double nextDouble()throws IOException
    {
      return Double.valueOf(next());
    }
    boolean hasNext()
    {
      while(Tokenizer==null || !Tokenizer.hasMoreTokens())
      {
        try
        {
          Tokenizer=new StringTokenizer(in.readLine());
        } catch (Exception e)
        {
          return false;
        }
      }
      return true;
    }
  }
}

我们简单一点也一样

import java.io.*;
import java.util.*;
 
public class Main{
  public static void main(String[] args){
        //对象声明
    Scanner sc = new Scanner(System.in);
    //获取所给值
        int n = sc.nextInt();
    //各位进行声明
    int ge, shi, bai, qian, wan, shiWan;
    //通过确定的循环范围来进行每个数的判断
    for(int i=10000; i<999999; i++){
      //分别取出每个数
      ge = i % 10;
      shi = i / 10 % 10;
      bai = i / 100 % 10;
      qian = i / 1000 % 10;
      wan = i / 10000 % 10;
      shiWan = i / 100000 % 10;
      
            //若与所给值不相等,跳过
      if(ge+shi+bai+qian+wan+shiWan != n){
        continue;
      }
      
      //将与所给值相等的数转换为字符串,方便进行5或6位数的判断
      String str = ""+i;
      //5位数回文数要求首位与末位、次位与次末位相等
      if(str.length() == 5 && ge == wan && shi == qian){
        System.out.println(i);
      }
      //6位数回文数则在5位数的要求上添加第三位与倒数第三位相等的条件即可
      if(str.length() == 6 && ge == shiWan && shi == wan && bai == qian){
        System.out.println(i);
      }
    }
  }
}

用自定义函数来处理一下

import java.util.Scanner;
public class Main {
  public static void f(int n) {
    for(int i=10000;i<1000000;i++) {
      if(i<100000) {
        int a,b,c,d,e;
        a=i/10000;
        b=i/1000%10;
        c=i/100%10;
        d=i/10%10;
        e=i%10;
        if(a==e&&b==d&&a+b+c+d+e==n) {
          System.out.println(i);
        }
      }else {
        int a,b,c,d,e,f;
        a=i/100000;
        b=i/10000%10;
        c=i/1000%10;
        d=i/100%10;
        e=i/10%10;
        f=i%10;
        if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n) {
          System.out.println(i);
        }
      }
    }
  }
  public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    int n=input.nextInt();
    f(n);
 
  }
}

方法有很多种,自己多捉摸捉摸就更多了。

Python语言

最少的代码,解决最多的问题。

n = int(input())
for i in range(1,10):
    s1 = i * 10001
    for j in range(10):
        k = n - 2 * (i + j)
        if k < 10:
            print(s1+j*1010+k*100)
if not n%2:
    for i in range(1,10):
        s1 = i * 100001
        for j in range(10):
            k = n//2 - i - j
            if k < 10:
                print(s1+j*10010+k*1100)

总结

别看题目不复杂,但是代码处理起来还是非常麻烦的,故而我们下一阶段目标是Python语言,让我们的解题速度可以更快,先把Java语言搞明白是为了我们的工作能更顺利。必经绝大多数企业都是用的Java语言来解决各种各样的问题的。

没有什么不付出就能拿到的结果,我们都是在负重前行,最终结果与自身先天的脑力有一定的关系,但是还是有很大一部分看自己后天的努力,其实从报名到比赛也就5个月左右,真正刷题的事件也就2个月,2个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。


相关文章
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
111 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
67 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
72 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
96 0
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
89 1
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
86 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
90 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
93 0
|
7月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
94 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
99 0