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

举报
红目香薰 发表于 2023/02/15 01:33:30 2023/02/15
【摘要】 ​ ​编辑第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数目录第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数前言基础练习 特殊回文数C语言C++语言Java语言Python语言总结前言        最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是d...

 编辑

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


目录

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

前言

基础练习 特殊回文数

C语言

C++语言

Java语言

Python语言

总结




前言

        最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是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语言来解决各种各样的问题的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。