public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 若n自身就是一个完全平方数
int tempNum = (int)(Math.sqrt(n));
if (tempNum * tempNum == n) {
System.out.println(n);
return ;
}
// 键盘输入的n不是完全平方数
// 布尔变量flag标识n可否由若干个(不重复的)完全平方数相加得到
boolean flag = false;
Set<Integer> set = new HashSet<>();
while (n >= 1) {
// 对n开方
int temp = (int)(Math.sqrt(n));
if (temp * temp == n) {
// 构成n的若干完全平方数,是不允许重复的。否则也就不可能输出NA了.
// 比如n,如果允许完全平方数重复,它肯定可以由n个1相加得到,不可能输出NA
if (set.contains(n)) {
break;
}
flag = true;
}
set.add(temp * temp);
n -= temp * temp;
}
if (flag) {
List<Integer> list = new ArrayList<>(set);
// 排序
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
if (i != list.size() - 1) {
System.out.print(list.get(i) + " ");
} else {
System.out.println(list.get(i));
}
}
}
if (!flag) {
System.out.println("NA");
}
}
} 楼主可以参考下我的代码,写得不一定优雅、简洁,但我自己测试的时候,能通过绝大多数样例。
存在问题:样例输入41,我的输出是1 4 36,正确输出应该是16 25 。
我正在review代码,寻求将这个问题解决,如果有老哥看出问题所在,请指点一下,谢谢。