vivo2020 école de printemps recrue - le produit du nombre de bits

Titre description

Le produit est maintenant donné tout entier positif n, et l'aspect de sortie pour le m entier positif plus petit (m> 9), de telle sorte que le m bits individuels (bits, dix, cent ... ...) est égal à n, si -1 sortie existe.

solution Mon problème

violence Loi

La plus idée originale est traversée, puisque ce nombre ne doit pas être inférieur à n, n de l'accumulation de départ, puis converti en un tableau de caractères, calcule le produit, la détermination de
la méthode stupide, et il est la condition de terminaison difficile est fournie.

    public int solution (int n) {
        int a = n;
        while(true){
            char [] arr = Integer.toString(a).toCharArray();
            int m=1;
            for(char s:arr){
                m*=s-48;
            }
            if(m>6*n)return -1;
            else if (m==n) return a;
            a++;
        }
    }

méthode factorisation

Le premier numéro de factorisation complète n = n1 * n2 ··· nx
s'il y a un facteur supérieur à 9, ne doit pas exister m, pourquoi?
Nous savons que le facteur est pas nécessairement un multiple de 2-9, alors nous devons utiliser le produit de nombres à un seul chiffre qui ne sont pas, il n'existe certainement pas m, directe -1
Ainsi , nous avons déterminé le facteur de factorisation de 2 à 9 entre
nous utilisons un tableau pour stocker le nombre de fois que chaque facteur apparaît. Numéro ARR [i] i représente semble
faire le m minimum, il doit faire un grand nombre faible, comme cela devrait être placé dans les 9 bits inférieurs comme.
Nous de la partie supérieure de la matrice deuxième balayage inférieure 9, de trouver toute la composition possible d'un grand nombre de facteurs, pour le remplissage faible.
Le nombre obtenu doit être minime.

    public int solution (int n) {
        int arr[] = new int[10]; //2~9用于存放因子个数
        for(int i=2;;i++){//因式分解,从2~9判断
            if(n==1)break;//完成
            if(i>9)return -1;//有大于9的因子,返回-1,结束
            if(n%i==0){  // 可以整除
                arr[i]++;//因子数量+1
                n = n/i; //除去因子
                i--;     //彻底分解,再次判断还能不能被i分解
            }
        }
        String res = ""; //用一个字符串存放结果
        for(int i=9;i>0;i--){ //从高位(9)开始扫描
            while(arr[i]>0){ //先看是否存在单个这样的数,如9
                res=i+res;
                arr[i]--;
            }
            //再看有没有多个数积是i的
            //由于不同的i 的因子组成不同,如8=2*2*2= 2*4,于是分情况讨论
            switch(i){
                case 9:
                    while(arr[3]>=2){
                        res="9"+res;
                        arr[3]-=2;
                    }
                    break;
                case 8:
                    while(arr[2]>=3){
                        res="8"+res;
                        arr[2]-=3;
                    }
                    while(arr[2]>0&&arr[4]>0){
                        res="8"+res;
                        arr[2]--;
                        arr[4]--;
                    }
                    break;
                case 6:
                    while(arr[2]>0&&arr[3]>0){
                        res="6"+res;
                        arr[2]--;
                        arr[3]--;
                    }
                    break;
                case 4:
                    while(arr[2]>=2){
                        res="4"+res;
                        arr[2]-=2;
                    }
                //7、5、3是素数,不能被非1因子分解
            }
        }
        return  Integer.valueOf(res);//返回结果
    }

Je suppose que tu aimes

Origine www.cnblogs.com/XT-xutao/p/12596299.html
conseillé
Classement