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代码,寻求将这个问题解决,如果有老哥看出问题所在,请指点一下,谢谢。