题目传送门
题目大意
输入一个整数 n ( 1 ≤ n ≤ 1 0 18 ) n(1\le n \le 10^{18}) n(1≤n≤1018)。
找出满足条件并且最大的 x ( 1 ≤ x ≤ n ) x(1\le x \le n) x(1≤x≤n),使得 x x x 是一个回文数,并且 x = k 3 x=k^3 x=k3,并且 k k k 为正整数。
最后输出满足条件的最大的 x x x。
翻译 by @Programming_Konjac
解题思路
这道题目既然让我们求不超过
n
n
n 的最大的回文完全立方数,那我们就可以先用 cbrt
函数求出
n
n
n 的立方根,然后再挨个判断他们的立方数是否为回文数即可。
在判断回文数的时候,我是将这个数转成字符串类型,然后反转字符串,判断前后两个字符串是否相同,如果相同就是回文数,否则不是回文数。
但是建议以后少用 cbrt
,这次比赛中我因为这个函数有精度误差调了很久,最后搞了很久才搞对,不如直接枚举
i
i
i,直到
i
3
⩾
n
i^3\geqslant n
i3⩾n 为止。
CODE:
#include <bits/stdc++.h>
using namespace std;
int main()
{
unsigned long long n;
cin >> n;
for (unsigned long long i = cbrt(n) + 1; ; i--)
{
if (i * i * i > n)
continue;
string a = to_string(i * i * i);
string b = a;
reverse(a.begin(), a.end());
if (a == b) {
cout << i * i * i;
return 0;
}
}
cout << 1;
return 0;
}
总结
以后少用有精度误差的函数。。。这题其实很简单,我们按题意模拟即可。