问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
想到了两种方法:一种是直接从10000开始遍历到999999,在对每个数的每一位单独拆分出来求和以及相等比较,可能会浪费比较多的时间,并且一开始我并不是做的对10不断取余来获得每一位上的值,而是直接将其转化为字符串str,通过
string tmpi = to_string(i);
int sum = 0;
if (tmpi[0] == tmpi[4] && tmpi[1] == tmpi[3]) {
for (int j = 0; j < 5; j++) {
sum += (tmpi[j] - '0');
}
if(n==sum)
cout << tmpi << endl;
会造成浪费时间,并且蓝桥杯的测试系统,不支持C11新特性to_string()函数,会报错:
code.cpp: In function 'void findPail(int)':
code.cpp:21:28: error: 'to_string' was not declared in this scope
string tmpi = to_string(i);
^
因此改为使用数字,不通过字符串还可以节省大量的时间。
另一种思路类似于解方程,也就是求这两个方程的解,并把解按照从小到大的顺序排序:
- 2x+2y+z=n
- 2x+2y+2z=n
但是一开始虽然想到了第二种方法,却没有想到如何求得xyz的值之后合理的输出,会不会出现重复的问题,参考了许多网上的文章找到了相同思路下的正确解决办法。
解决方案
思路一:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 10000; i <= 999999; ++i)//全部范围
{
//处理五位数 xxzyy
if (i <= 99999)
{
int a, b, c, d, e;
a = i % 10;
b = i / 10 % 10;
c = i / 100 % 10;
d = i / 1000 % 10;
e = i / 10000;
if (a == e && b == d && a + b + c + d + e == n)
cout << i << endl;
}
//处理六位数 xxyyxx
else
{
int a, b, c, d, e, f;
a = i % 10;
b = i / 10 % 10;
c = i / 100 % 10;
d = i / 1000 % 10;
e = i / 10000 % 10;
f = i / 100000;
if (a == f && b == e && c == d && a + b + c + d + e + f == n)
cout << i << endl;
}
}
return 0;
}
思路二:
// specialPalindrome.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <string>
using namespace std;
void findPail(int n);
int main(void)
{
int cmpN = 0;
string numStr = "";
cin >> cmpN;
findPail(cmpN);
return 0;
}
void findPail(int n) {
//首先在5位数字中查找 2x+2y+z=n
for (int x = 1; x < 10; x++) {
for (int y = 0; y < 10; y++) {
for (int z = 0; z < 10; z++) {
if (2 * x + 2 * y + z == n)
cout << x << y << z << y << x << endl;
}
}
}
//6位数字中查找 2x+2y+2z=n
for (int x = 1; x < 10; x++) {
for (int y = 0; y < 10; y++) {
for (int z = 0; z < 10; z++) {
if (2 * x + 2 * y + 2 * z == n)
cout << x << y << z << z << y << x << endl;
}
}
}
}
整体有思路,但在具体实现时出现许多问题,还需要练习。