资源限制
时间限制: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;
}