枚举完全平方数,检查n - i * i 是不是回文数即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int i = 1;
while (i * i <= n) {
int rest = n - i * i;
if (isPalindrome(rest)) {
System.out.println("YES");
System.out.println(rest + " " + (i * i));
return;
}
i++;
}
System.out.println("NO");
}
private static boolean isPalindrome(int num) {
String str = String.valueOf(num);
String reversed = new StringBuilder(str).reverse().toString();
return str.equals(reversed);
}
}
n = int(input())
i = 1
while i * i <= n:
rest = n - i * i
x = str(rest)
y = x[::-1]
if x == y:
print("YES")
print(rest , i * i)
exit()
i += 1
print("NO")
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome(int num) {
string str = to_string(num);
string reversed = string(str.rbegin(), str.rend());
return str == reversed;
}
int main() {
int n;
cin >> n;
int i = 1;
while (i * i <= n) {
int rest = n - i * i;
if (isPalindrome(rest)) {
cout << "YES" << endl;
cout << rest << " " << (i * i) << endl;
return 0;
}
i++;
}
cout << "NO" << endl;
return 0;
}
OJ会员可以通过点击题目上方《已通过》查看其他通过代码来学习。
一个整数为好数,当且仅当仅可以拆分为一个回文数和一个完全平方数的和。
小明给你一个整数N,请你帮助他计算一下N是否为好数。
设X是一任意自然数。若将X的各位数字反向排列所得自然数Y与X相等,则称X为一回文数。
例如,若X=1234321为回文数。
在一行上输入一个整数N(1≤N≤105)表示小明给定的整数,
若为好数,在第一行输出YES ,然后在第二行输出两个整数P,Q ,满足P是回文数,Q是完全平方数,
且P+Q=N;否则,直接输出NO。
如果存在多个解决方案,请输出Q最小的那一个
输入
2
输出
YES
1 1
输入
123
输出
YES
2 121