小红的好数
[题目链接](https://www.nowcoder.com/practice/a4e3706a856644289a7a60b8d93fa5fc)
思路
一个整数 是"好数",当且仅当存在一种拆分方式,使得
,其中
是回文数,
是完全平方数(
)。
枚举完全平方数
枚举所有满足 的完全平方数,判断
是否为回文数:
- 从
开始,令
;
- 计算
;
- 判断
是否为回文数(将数字转为字符串,与其反转比较);
- 若是,输出
YES及和
;若遍历完所有平方数都未找到,输出
NO。
复杂度分析
枚举平方数最多 次,每次判断回文数为
,总体复杂度
。
注意事项
是合法的完全平方数(
),需要包含在枚举范围内;
- 回文数需要
,即
,枚举
即满足;
- 题目允许输出任意合法答案。
样例演示
样例 1:
:
,
,"2" 是回文数,输出
YES\n2 0(也可输出1 1,均合法)
样例 2:
:
,
,"35" 非回文
:
,
,"34" 非回文
:
,
,"31" 非回文
:
,
,"26" 非回文
:
,
,"19" 非回文
:
,
,"10" 非回文
- 遍历结束,输出
NO
代码
C++
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(long long x) {
if (x < 0) return false;
string s = to_string(x);
string r = s;
reverse(r.begin(), r.end());
return s == r;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long long n;
cin >> n;
for (long long i = 0; i * i <= n; i++) {
long long sq = i * i;
long long rem = n - sq;
if (rem >= 0 && isPalindrome(rem)) {
cout << "YES" << endl;
cout << rem << " " << sq << endl;
return 0;
}
}
cout << "NO" << endl;
return 0;
}
Java
import java.util.Scanner;
public class Main {
static boolean isPalindrome(long x) {
if (x < 0) return false;
String s = Long.toString(x);
String r = new StringBuilder(s).reverse().toString();
return s.equals(r);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
for (long i = 0; i * i <= n; i++) {
long sq = i * i;
long rem = n - sq;
if (rem >= 0 && isPalindrome(rem)) {
System.out.println("YES");
System.out.println(rem + " " + sq);
return;
}
}
System.out.println("NO");
}
}

京公网安备 11010502036488号