第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数
前言
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是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个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。