#include<sstream>
stringstream s;
s.str()
s << <<
#include <iostream>
#include <queue>
#include <sstream>
using namespace std;
queue<string> que_6;
/*
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n
。 输入格式 输入一行,包含一个正整数n。 输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入 52 样例输出 899998
989989
998899
数据规模和约定
1<=n<=54。
*/
/*
首先想想回文的特点,对称,即只看一半即可。分两种情况。5位的和六位的,分别区别处理。
想要跑快一点,一次循环处理五位的和六位的。有要求从小到大输出,即可以先把六位先放在queue里,
先入先出。带五位的输出完,再打出。
*/
void deal(int num) {
int a, a1, a2, a3, temp = 0;
if (num % 2 == 1) {
for (int i = 100; i <= 999; i++) {
a = i;
a1 = a / 100;
a = a % 100;
a2 = a / 10;
a3 = a % 10;
/*
减少循环次数,用离散数学的角度来解释的话,可以说:
这是一个包含的时间(a1 + a2 + a3 > num) >= (a1 + a2 > num) >= (a1 > num)
这种情况用嵌套的if判断。
而对等的情况是时件互斥的时使用。
*/
if (a1 + a2 + a3 > num) {
if (a1 + a2 > num) {
if (a1 > num) {
i = 1000;
}
i = 100 * (a1 + 1);
}
i = a1 * 100 + (a2 + 1) * 10;
}
if (a1 * 2 + a2 * 2 + a3 == num) {
cout << i << a2 << a1 << endl;
}
}
}
else if (num % 2 == 0) {
for (int i = 100; i <= 999; i++) {
a = i;
a1 = a / 100;
a = a % 100;
a2 = a / 10;
a3 = a % 10;
if (a1 + a2 + a3 > num) {
if (a1 + a2 > num) {
if (a1 > num) {
i = 1000;
}
i = 100 * (a1 + 1);
}
i = a1 * 100 + (a2 + 1) * 10;
}
if (a1 * 2 + a2 * 2 + a3 == num) {
cout << i << a2 << a1 << endl;
}
if (a1 * 2 + a2 * 2 + a3 * 2 == num) {
stringstream s; //注意stringstream用法
s << i << a3 << a2 << a1 << endl;
que_6.push(s.str());
}
}
while (que_6.empty() == 0) {
cout << que_6.front();
que_6.pop();
}
}
}
int main() {
int num;
cin >> num;
deal(num);
system("pause");
return 0;
}
本文介绍了一种算法,用于找出所有五位和六位的回文数,这些数的各位数字之和等于给定的正整数n。通过巧妙地利用回文数的对称特性,该算法能够有效地生成并输出满足条件的整数。
172万+

被折叠的 条评论
为什么被折叠?



