实习笔试-数字重排列

题目描述:

小红给定一个数字,现在她准备把其数位上的数字重新排列,使得重排后的数字满足其数位上的数字都一致,例如x=213,重排后可以是123132231312321但不能是 213,因为其没有进行重排,又例如10,其不存在重排后的数字,因为仅存在[10.01],其不仅和原数字相同日存在前导0,不构成会法数字。
现在请你帮助小红计算有多少个重排后的数字 y,使得gcd(x,y)1.

输入:整型变量
输出:整型变量
思路
使用BigInteger的gcd方法,返回最后生成的对象是否和原数字互质

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

/**
 * @Title: test_Ant_2
 * @Author Vacant Seat
 * @Date 2025/3/14 22:15
 */
public class test_Ant_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        Set<String> permutations = new HashSet<>();
        boolean[] used = new boolean[chars.length];
        generatePer(chars,used,new StringBuilder(),permutations);
        //将输入的字符串s转换为BigInteger对象
        BigInteger x = new BigInteger(s);
        //记录总数
        int count = 0;
        //遍历set集合中的每一个元素
        for(String perm : permutations){
            if(perm.charAt(0) == '0'){
                //如果起手是0,跳过
                continue;
            }
            if(perm.equals(s)){
                //如果是原来的串,跳过
                continue;
            }
            //如果都不是,则转换为BigInteger对象
            BigInteger y = new BigInteger(perm);
            //判断是否互质
            /**
             * BigInteger.ONE 是 BigInteger 类中的一个常量,表示数值为 1 的 BigInteger 对象
             * compareTo 是 BigInteger 类中的一个方法,用于比较两个 BigInteger 对象的大小。它的返回值是一个整数,含义如下:
             *                      如果调用对象大于参数对象,返回值为正整数。
             *                      如果调用对象等于参数对象,返回值为 0。
             *                      如果调用对象小于参数对象,返回值为负整数。
             * x.gcd(y).compareTo(BigInteger.ONE) 的作用是判断 x 和 y 的最大公约数是否大于 1
             */
            if(x.gcd(y).compareTo(BigInteger.ONE) > 0){
                count++;
            }
        }
        System.out.println(count);
    }
    public static void generatePer(char[] chars, boolean[] used, StringBuilder cur, Set<String> permutations){
        //判断是否递归结束
        if(cur.length() == chars.length){
            //然后向set集合中加入cur的String对象
            permutations.add(cur.toString());
            return;
        }
        //进入循环
        for(int i = 0; i < chars.length; i++){
            //如果当前数字已经用过,则进行下轮循环
            if(used[i]){
                continue;
            }
            //如果当前数字和上一个数字相等且前一个字符未被使用,跳过,避免生成重复的排列
            if(i > 0 && chars[i] == chars[i - 1] && !used[i-1]){
                continue;
            }
            used[i] = true;
            cur.append(chars[i]);
            generatePer(chars,used,cur,permutations);
            //回溯
            cur.deleteCharAt(cur.length() - 1);
            used[i] = false;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值