这个问题的C++代码
时间: 2024-09-25 22:21:21 浏览: 31
对于这个问题的C++代码,首先我们需要定义一些辅助函数来检查一个数是否为回文数、立方数或平方数。接着,我们可以设计一个主函数来遍历价格n附近的数,尝试找出最接近的符合立方数和平方数差值的回文数。
以下是一个简化的C++代码示例:
```cpp
#include <iostream>
#include <cmath>
#include <string>
bool isPalindrome(int num) {
std::string str = to_string(num);
int start = 0, end = str.length() - 1;
while (start < end) {
if (str[start] != str[end])
return false;
start++;
end--;
}
return true;
}
bool isPerfectCube(int num) {
double cubeRoot = cbrt(num);
return (cubeRoot * cubeRoot * cubeRoot == num);
}
bool isPerfectSquare(int num) {
int sqrtNum = static_cast<int>(sqrt(num));
return (sqrtNum * sqrtNum == num);
}
int findNextPalindromicPrice(int price, bool increase) {
// 初始化方向标志和价格
int step = increase ? 1 : -1;
int candidate = price + step;
while (true) {
if (isPalindrome(candidate) && (isPerfectCube(candidate) || isPerfectSquare(candidate)))
return candidate + 10; // 加上10元
else if (!isPalindrome(candidate))
break; // 如果不是回文数,结束寻找
candidate += step;
}
// 如果没找到,返回当前价格
return price;
}
int main() {
int T;
std::cin >> T;
for (int i = 0; i < T; ++i) {
int n;
std::cin >> n;
// 调用函数查找并输出结果
int adjustedPrice = findNextPalindromicPrice(n, true); // 初始找下一个大于n的回文数
if (adjustedPrice > n) {
adjustedPrice -= 10; // 回退一步到小于n的回文数
if (isPalindrome(adjustedPrice)) {
std::cout << adjustedPrice << " yuan\n";
} else {
std::cout << n << " yuan\n"; // 如果找不到小于n的回文数,直接输出原价
}
} else {
std::cout << adjustedPrice << " yuan\n";
}
}
std::cout << "Happy TEACHER's Day!\n";
return 0;
}
```
在这个代码中,`main`函数首先读入测试案例的数量T,然后对每个价格n调用`findNextPalindromicPrice`函数,查找最接近的符合条件的回文数。注意代码中对回文数查找的方向判断,先尝试寻找大于n的回文数,如果没有则尝试小于n的回文数。最后输出价格并打印节日祝福信息。
阅读全文