java刷题--技能树蓝桥基础16-排他平方数

题目

203879 * 203879 = 41566646641

这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

具有这样特点的6位数还有一个,请你找出它!

再归纳一下筛选要求:

  1. 6位正整数

  1. 每个数位上的数字不同

  1. 其平方数的每个数位不含原数字的任何组成数位

问题分析

六位数的平方,超过了int的范围,需要使用大数BigInteger

查看set重是否有相对应的数,如果没有,那就代表这个数的每一位和平方数的每一位都不相同(平方数允许数字重复出现)

通过取余和/10的方法来获取每一个数字进行判断

判断使用

使用set.contains(int data)是查找set是否存在数据data

代码实现

package 刷题2集;

import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;

public class 排他平方数 {

    public static void main(String[] args) {
         //从203879之后开始遍历
         for(int i = 203880;i<=999999;i++){
           if(bf(i)){
              System.out.println(639172);
           }
         }
    }
     public static boolean bf(int n){
         Set<Integer> set = new HashSet<>();
         //n的平方很大,需要用大数
         BigInteger big = new BigInteger(n+"");
         //求这个大数的平方
         big = big.multiply(big);
         //将n的每一位都存放到set里面,如果没有重复的数据,就进行下一步的平方数重复查找
         while(n>0){
           if(!set.add(n%10)){
             return false;
           }
           n/=10;
         }
         //用str确定下来这个平方数的位数,方便循环
         String str = big.toString();
         for(int i = 0;i<str.length();i++){
           //平方数求余10
             BigInteger b = big.mod(new BigInteger("10"));
           //平方数求余10得到的结果转换成int
             int data = b.intValueExact();
           //set.contains(int data)是查找set是否存在数据data,如果存在,那么就和提议不符合,进行下一个i的判断
           if(set.contains(data)){
             return false;
           }
           //每次判断完,都要对这个平方数除10,方便求上一位数
           big = big.divide(new BigInteger("10"));
         }
         //如果循环结束都没有返回false,代表满足题意,返回true
         return true;
       }


    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CLODVEP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值