测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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;

}

上一题 下一题