A27374. 翻转数相乘
题目描述
翻转数相乘
题目描述
假设一个 n 位数,如 a1a2a3…an,其中 ai是这个数的第 i 位上的数字,且这个 n位数不是每个位都相等的数字,例如不是 2222 或类似。如果有一个整数 x,并且1<x<10,使得 a1a2a3…an*x=anan-1an-2…a1,求 x,其中 a1和 an不能为 0,如果 x 无解,则输出 0,如果有多个 x,则从小到大输出所有 x 的解,中间用空格隔开。例如:一个 5 位数,ABCDE * ? = EDCBA,其中 A、B、C、D、E 是个位整数,ABCDE 和 EDCBA是一个万位数,求符合这个等式的乘数。
输入格式
输入 1 个数,表示要求解的 n 位数。
输出格式
输出表示所有可能的乘数,并按照从小到大排列,用回车隔开。
样例输入
6样例输出
4
9注意事项
请严格按要求输出,不要多余的打印语句,例如:“输入 x=...” 等多余内容。本程序的代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main 函数需要返回 0。
注意: 只使用 ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include<xxx>, 不能通过工程设置而省略常用头文件。
参考答案
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n; // 输入的n位数
cin >> n;
vector<int> results; // 用于存储符合条件的乘数x
// 遍历所有可能的乘数x(2到9)
for (int x = 2; x <= 9; ++x) {
int reversed = 0; // 用于存储翻转后的数
int temp = n;
// 翻转数字n
while (temp > 0) {
reversed = reversed * 10 + temp % 10;
temp /= 10;
}
// 检查是否满足条件:n * x == reversed
if (n * x == reversed) {
results.push_back(x); // 将符合条件的x加入结果列表
}
}
// 如果没有找到符合条件的x,输出0
if (results.empty()) {
cout << 0 << endl;
} else {
// 按从小到大顺序输出所有符合条件的x
for (int i = 0; i < results.size(); ++i) {
cout << results[i];
if (i < results.size() - 1) {
cout << " "; // 输出空格分隔
}
}
cout << endl; }
return 0;
}答案解析
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 反转数字的函数
int reverseNumber(int num, int n) {
int reversed = 0;
for (int i = 0; i < n; ++i) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return reversed;
}
// 检查数字是否所有位都相同
bool isAllDigitsSame(int num, int n) {
int digit = num % 10;
for (int i = 1; i < n; ++i) {
num /= 10;
if (num % 10 != digit) {
return false;
}
}
return true;
}
int main() {
int n;
cin >> n;
vector<int> solutions;
for (int x = 2; x <= 9; ++x) {
int lower = ceil(pow(10, n - 1) / x);
int upper = floor((pow(10, n) - 1) / x);
for (int num = lower; num <= upper; ++num) {
int reverse_num = reverseNumber(num, n);
if (num * x == reverse_num) {
// 检查 num 和 reverse_num 是否满足条件
if (num >= pow(10, n - 1) && reverse_num >= pow(10, n - 1) &&
!isAllDigitsSame(num, n)) {
solutions.push_back(x);
break; // 每个 x 只需要一个解
}
}
}
}
if (solutions.empty()) {
cout << 0 << endl;
} else {
sort(solutions.begin(), solutions.end());
for (int x : solutions) {
cout << x << endl;
}
}
return 0;
}