蓝桥杯特殊回文数python_蓝桥杯等级考试18级有用吗「建议收藏」

蓝桥杯特殊回文数python_蓝桥杯等级考试18级有用吗「建议收藏」蓝桥杯——特殊回文数问题描述123321是一个非常特殊的数,它从左边读和从右边读是一样的

蓝桥杯——特殊回文数

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

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

输出格式

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

样例输入

52

样例输出

899998
989989
998899

数据规模和约定

1<=n<=54。

对人友好对机器不友好的解法:暴力激活成功教程

import java.util.Scanner;

public class Main { 
   
	public static void main(String[] args) { 
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		for (int i = 10000; i < 999999; i++) { 
   
			StringBuilder sb = new StringBuilder();
			String str = sb.append(String.valueOf(i)).toString();
			String str1 = sb.reverse().toString();
			if (str.equals(str1)) { 
   
				int sum = 0;
				int m = i;
				while (m > 0) { 
   
					sum += m % 10;
					m = m / 10;
				}
				if (sum == n) { 
   
					System.out.println(i);
				}
			}
		}
	}
}

在这里插入图片描述
稍微用了脑子的做法:我们分析一下回文数n,如果是五位回文数则为XYZXY格式,则中间的Z的取值范围(0-9),XY的取值范围为(10-99),然后让n – Z = (X + Y ) * 2,最后拼接就OK,如果是六位回文数XYZZYX,则XYZ的取值的范围(100-999),找到X + Y + Z = n / 2,最后拼接就OK。注意如果是五位,记得排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main { 
   

	public static void main(String[] args) { 
   
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) { 
   
			if ((n - i) % 2 == 1)
				continue;
			else { 
   
				int temp = (n - i) / 2;
				for (int j = 10; j < 100; j++) { 
   
					int x = j / 10;
					int y = j % 10;
					if (x + y == temp) { 
   
						list.add(10000 * x + 1000 * y + 100 * i + 10 * y + x);
					}
				}
			}
		}
		if (!list.isEmpty()) { 
   
			Collections.sort(list);
			for (int i : list) { 
   
				System.out.println(i);
			}
		}
		if (n % 2 == 0) { 
   
			n = n / 2;
			for (int j = 100; j < 1000; j++) { 
   
				int x = j / 100;
				int y = (j / 10) % 10;
				int z = j % 10;
				if (x + y + z == n) { 
   
					System.out.println(100000 * x + 10000 * y + 1000 * z + 100 * z + 10 * y + x);
				}
			}
		}
	}

}

在这里插入图片描述
后来仔细想了想的做法:自己是不是傻?n有两种可能 X + Y + Z + Y+ X = 2 * (X + Y) + Z = n或者 X +Y +Z + Z + Y + X = 2 * ( X + Y + Z) = n,XYZ的取值的范围(100-999),我只需要判断以上两种情况就可以,两者的区别就是加不加Z。注意需要排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main { 
   

	public static void main(String[] args) { 
   
		Scanner input = new Scanner(System.in);
		try { 
   
			int n = input.nextInt();
			List<Integer> list = new ArrayList<Integer>();
			for (int j = 100; j < 1000; j++) { 
   
				int x = j / 100;
				int y = (j / 10) % 10;
				int z = j % 10;
				if (2 * (x + y) + z == n)
					list.add(10000 * x + 1000 * y + 100 * z + 10 * y + x);
				if (2 * (x + y + z) == n)
					list.add(100000 * x + 10000 * y + 1000 * z + 100 * z + 10 * y + x);
			}
			if (!list.isEmpty()) { 
   
				Collections.sort(list);
				for (int i : list)
					System.out.println(i);
			}
		} catch (Exception e) { 
   
			input.close();
		}
	}

}

在这里插入图片描述

今天的文章蓝桥杯特殊回文数python_蓝桥杯等级考试18级有用吗「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84443.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注