java实现排他方数(性能最优)

题目:
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,
并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:

要求1:6位正整数
要求2:每个数位上的数字不同
要求3:其平方数的每个数位不含原数字的任何组成数位
实现代码:

package com.dj.zuoy1;
import java.util.*;
public class Number {
    // 判断不同
    public static Set bt(long x) {
        Set t = new HashSet(); // hashset集合
        String s = "" + x;
        for(int i=0; i<s.length(); i++) {
            t.add(s.charAt(i)); // charAt() 方法可返回指定位置的字符。
        }
        return t;
    }

    public static boolean f(int x) {
        long y = (long)x * x;
        Set a = bt(x);
        Set b = bt(y);
        if(a.size() != 6) {
            return false;
        }
        a.retainAll(b);
        // retainALL方法: 如果集合a中的元素都在集合b中则a中的元素不做移除操作,
        // 反之如果只要有一个不在a中则会进行移除操作。
        // 即:list进行移除操作返回值为:true反之返回值则为false。
        return a.isEmpty();
        //isEmpty()  方法分配了内存空间,值为空,是绝对的空
    }

    public static void main(String[] args) {
        final int A =100000;
        final int B =1000000;
        for(int i=A; i<B; i++) {
            if(f(i))
                System.out.println(i);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45795349/article/details/106391415