特殊回文数,123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。蓝桥杯问题一次性解答,含JAVA,C++代码

小可爱们大家好
这次是本小殿下第一次写文章多多担待哦^ - ^。

问题描述
  
  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);
				}

			}
		}
	}
}

答案
在蓝桥杯的检测中有很多细节的地方需要注意!!!
不然会纠结很久。

  1. 答案的顺序很重要,顺序指的是
    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;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值