试题 基础练习9 特殊回文数

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

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

输出格式

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

样例输入

52

样例输出

899998
989989
998899

数据规模和约定

1<=n<=54。

#include<iostream>
#include<sstream>
#include<string>
#include<cmath>
#include<vector>

using namespace std;

int main()
{
    
    
	// 因为输出并不是从小到大,所以一些节点会有问题,总的答案没什么问题
    // 可以用map来改进
  
	int target;
	int one, two, three, mid;
	vector<long long> result;
	cin >> target;
	// five-digit number
	for (mid = 0; mid < 10; mid++)
	{
    
    
		if (target - mid < 1)//mid is too small
			continue;
		if (target - 36 > mid)//mid is too big
			continue;
		for(one = 1;one<10;one++)
		{
    
    
			two = (target - mid - 2 * one) / 2;
			if (two < 0 || two>9)
				continue;
			if (2 * one + 2 * two + mid == target)
			{
    
    
				result.push_back(one * 10001 + two * 1010 + mid * 100);
			}
		}
	}
	// six-digit number
	for (one = 1; one < 10; one++)
		for (two = 0; two < 10; two++)
		{
    
    
			three = (target - 2 * two - 2 * one) / 2;
			if (three < 0 || three>9)
				continue;
			if (2 * one + 2 * two + 2 * three == target)
			{
    
    
				result.push_back(one * 100001 + two * 10010 + three * 1100);
			}
		}
	/*排序在这里
	long long tem;
	for (int i = 0;i<result.size();i++)
		for (int j = i; j < result.size(); j++)
		{
			if (result[i] > result[j])
			{
				tem = result[i];
				result[i] = result[j];
				result[j] = tem;
			}
		}
	*/
	//输出
	for (int i = 0; i < result.size(); i++)
	{
    
    
		cout << result[i] << endl;
	}
		

	cin.get();
	cin.get();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39117858/article/details/104222156