首页 > 试题广场 >

数位重排

[编程题]数位重排
  • 热度指数:18 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
牛牛有一个正整数x,牛牛需要把数字x中的数位进行重排得到一个新数(不同于x的数),牛牛想知道这个新数是否可能是原x的倍数。请你来帮他解决这个问题。

输入描述:
输入包括t+1行,第一行包括一个整数t(1 ≤ t ≤ 10),
接下来t行,每行一个整数x(1 ≤ x ≤ 10^6)


输出描述:
对于每个x,如果可能重排之后变为自己的倍数输出"Possible", 否则输出"Impossible".
示例1

输入

2
14
1035

输出

Impossible
Possible
import java.util.Scanner;
import java.util.Arrays;
//思路:逆向思维,主动找出x的2至9倍的数字y,再判断数字y是否是由x交换数位得到。
//1、若x与y的位数不同,返回false //2、如果x,y位数相同,分别将x,y的数位存入数组arr1[],arr2[],然后再sort,再比较
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        int []arr = new int[t];
        for(int i=0;i<t;i++){
            arr[i]=in.nextInt();
        }
        for(int i=0;i<t;i++)
            for(int j=2;j<=9;j++){
                if(judge(arr[i],arr[i]*j))
                {
                    System.out.println("Possible");
                    break;
                }
                if(j==9){
                    System.out.println("Impossible");
                }
            }
    }
    public static boolean judge(int x,int y){
        String s1 = ""+x;
        String s2 = ""+y;
        if(s1.length()!=s2.length())
            return false;
        int []arr1 = new int[s1.length()];
        for(int i=0;i<s1.length();i++){
            arr1[i] = s1.charAt(i)-'0';
        }
        Arrays.sort(arr1);
        int [] arr2 = new int[s2.length()];
        for(int i=0;i<s2.length();i++){
            arr2[i]=s2.charAt(i)-'0';
        }
        Arrays.sort(arr2);
        for(int i=0;i<s1.length();i++){
            if(arr1[i]!=arr2[i]){
                return false;
            }
        }
        return true;
    }
}

发表于 2021-04-20 21:46:53 回复(0)