小可爱们大家好
这次是本小殿下第一次写文章多多担待哦^ - ^。
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定,1<=n<=54。
此题属于基础题,不难,但可以尽量把时间复杂的降低也不失是一种乐趣* - *。
枚举+判断 JAVA
import java.util.Scanner;
public class Palindrome {
public static void main(String[] agrs) {
int n = 0;
int i = 0, j = 0, k = 0;
Scanner m = new Scanner(System.in);
if (m.hasNext()) {
n = m.nextInt();
}
for (i = 1; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
if (i * 2 + j * 2 + k == n)
System.out.println("" + i + j + k + j + i);
}
}
}
for (i = 1; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
if (i * 2 + j * 2 + k * 2 == n)
System.out.println("" + i + j + k + k + j + i);
}
}
}
}
}
在蓝桥杯的检测中有很多细节的地方需要注意!!!
不然会纠结很久。
- 答案的顺序很重要,顺序指的是
589985
598895
不能变为
598895
589985
也就是在编程中for循环
for (i = 1; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
不能改为
for (i = 1; i < 10; i++) {
for (j = 9; j >=0; j--) {
for (k = 0; k < 10; k++) {
虽然看似结果一样但测试会不通过!!!
2. 注意5位整数或5位整数,则像正常数字一样最小的是10000,也就是除第一位意外,其余位皆可为0。
3. System.out.println("" + i + j + k + j + i);
在JAVA中像输出5个连续的整数需要在尾部或首部添加 “”。
进阶版(考虑奇偶性)
import java.util.Scanner;
public class Palindrome2 {
public static void main(String[] args) {
int n = 0;
int i, j, k, l;
Scanner sc = new Scanner(System.in);
if (sc.hasNext()) {
n = sc.nextInt();
}
/* 单数的情况和含有五位数的偶数部分 */
// 先看中间位
if (n % 2 == 0) {
l = 8;/* 当n为偶数时中间位最大为8 */
}
else {
l = 9;/* 奇数时最大可为9 */
}
for (k =1; k <10; k++) {
for (j = 0; j <10; j++) {
for (i = 0; i <=l; i++) {
if (k * 2 + j * 2 + i == n)
System.out.println("" + k + j + i + j + k);
}
}
}
if(n%2==0){/* 只有偶数的情况才会出现6位数 */
for (i = 1; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
if (2 * i + 2 * j + 2 * k == n)
System.out.println("" + i + j + k + k + j + i);
}
}
}
}
}
}
由于代码不难就不做过多解释啦,有问题的小宝宝可以私聊我。
C++ (方法与上面相同)
#include<iostream>
#include<algorithm>
using namespace std;
int ans[1000005];
int main()
{
int n,now,t=0;
cin>>n;
if(n%2==0)//只有偶数才有6位十进制数的可能
{
now=n/2;
for(int i=9;i>=1;i--)//第一位不能为0
{
if(now-i>=0)
{
for(int j=9;j>=0;j--)
{
if(now-i-j>=0)
{
for(int k=9;k>=0;k--)
{
if(i+j+k==now)
{
ans[t++]=i*100000+j*10000+k*1000+k*100+j*10+i;
}
}
}
}
}
}
}
//五位数的情况
int l;
if(n%2==0)
{
l=8;
}
else
l=9;
for(int i=l;i>=0;i=i-2)//先考虑最中间位数的情况,如果n是偶数,则最中间的一定是偶数,如果n是奇数,则中间位为奇数
{
if(n-i>=0)
{
now=(n-i)/2;
for(int j=9;j>=1;j--)//首位不为0
{
if(now-j>=0)
{
for(int k=9;k>=0;k--)
{
if(j+k==now)
ans[t++]=j*10000+k*1000+i*100+k*10+j;
}
}
}
}
}
sort(ans,ans+t);
for(int i=0;i<t;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}