web-dev-qa-db-fra.com

Java - numéro sous forme développée

J'ai donné le numéro et je veux qu'il retourne comme une chaîne sous forme développée. Par exemple

expandedForm(12); # Should return "10 + 2"
expandedForm(42); # Should return "40 + 2"
expandedForm(70304); # Should return "70000 + 300 + 4"

Ma fonction fonctionne pour les premier et deuxième cas, mais avec 70304 cela donne ceci: 

70 + 00 + 300 + 000 + 4

Voici mon code

import Java.util.Arrays;


public static String expandedForm(int num)
{

  String[] str = Integer.toString(num).split("");
  String result = "";

  for(int i = 0; i < str.length-1; i++) {
    if(Integer.valueOf(str[i]) > 0) {
      for(int j = i; j < str.length-1; j++) {
        str[j] += '0';
      }
    }
  }

  result = Arrays.toString(str);
  result = result.substring(1, result.length()-1).replace(",", " +");
  System.out.println(result);

  return result;
}

Je pense qu'il y a un problème avec la deuxième boucle, mais je ne peux pas comprendre pourquoi.

12
Asia

Vous devriez ajouter des "0" à str[i], pas str[j]:

  for(int i = 0; i < str.length-1; i++) {
    if(Integer.valueOf(str[i]) > 0) {
      for(int j = i; j < str.length-1; j++) {
        str[i] += '0';
      }
    }
  }

Cela se traduira par:

70000 + 0 + 300 + 0 + 4

Vous devez toujours vous débarrasser des 0 chiffres.

Une façon possible de s'en débarrasser:

result = result.substring(1, result.length()-1).replace(", 0","").replace(",", " +");

Maintenant, la sortie est

70000 + 300 + 4
14
Eran

Le pseudocode utilise un arithmétique entier pour extraire les chiffres décimaux un par un (à partir du bon):

mul = 1    //will contain power of 10
while (num > 0):
     Dig = num % 10    //integer modulo retrieves the last digit
     if (Dig > 0):   //filter out zero summands
          add (Dig * mul) to output   //like 3 * 100 = 300
     num = num / 10 //integer division removes the last decimal digit  6519 => 651
     mul = mul * 10    //updates power of 10 for the next digit
6
MBo

Vous pouvez faire de même avec les mathématiques pures, en utilisant modulo % et division entière /, par exemple. en utilisant Stream API:

int n = 70304;
String res = IntStream
        .iterate(1, k -> n / k > 0, k -> k * 10) // divisors
        .map(k -> (n % (k*10) / k ) * k)         // get 1s, 10s, 100s, etc.
        .filter(x -> x > 0)                      // throw out zeros
        .mapToObj(Integer::toString)             // convert to string
        .collect(Collectors.joining(" + "));     // join with '+'
System.out.println(res); // 4 + 300 + 70000
3
tobias_k

Il y a beaucoup de variations possibles. Si l'utilisation d'une liste est autorisée:

public static String expandedForm(int num){

    String[] str = Integer.toString(num).split("");
    String result;
    List<String> l = new ArrayList<String>();

    for(int i = 0; i < str.length; i++){
        if(Integer.valueOf(str[i]) > 0){
            String s = str[i];
            for(int j = i; j < str.length - 1; j++){
                s += '0';
            }
            l.add(s);
        }
    }

    result = l.toString();
    result = result.substring(1, result.length() - 1).replace(",", " +");
    System.out.println(result);

    return result;
}

On pourrait aussi travailler directement sur le résultat: 

public static String expandedForm2(int num){

    String[] str = Integer.toString(num).split("");
    String result = "";

    for(int i = 0; i < str.length; i++){
        if(Integer.valueOf(str[i]) > 0){
            result += str[i];
            for(int j = i; j < str.length - 1; j++){
                result += '0';
            }
            result += " + ";
        }
    }
    result = result.substring(0, result.length() - 3);
    System.out.println(result);
    return result;
}
2
Imago

Ceci est également possible de faire de manière récursive. Voici un exemple d'implémentation:

String g(int n, int depth){     // Recursive method with 2 int parameters & String return-type
  int remainder = n % depth;    //  The current recursive remainder
  if(depth < n){                //  If we aren't done with the number yet:
    int nextDepth = depth * 10; //   Go to the next depth (of the power of 10)
    int nextN = n - remainder;  //   Remove the remainder from the input `n`
                                //   Do a recursive call with these next `n` and `depth`
    String resultRecursiveCall = g(nextN, nextDepth);
    if(remainder != 0){         //   If the remainder was not 0:
                                //    Append a " + " and this remainder to the result
      resultRecursiveCall += " + " + remainder;
    }
    return resultRecursiveCall; //   And return the result
  } else{                       //  Else:
    return Integer.toString(n); //   Simply return input `n` as result
  }
}

String f(int n){                // Second method so we can accept just integer `n`
  return g(n, 1);               //  Which will call the recursive call with parameters `n` and 1
}

La deuxième méthode consiste à appeler la méthode avec une seule entrée n. Par exemple:

String result = f(70304);

Ce qui donnera le String 70000 + 300 + 4.

Essayez-le en ligne.


Pour expliquer un peu plus en profondeur ce que fait cette méthode récursive, faisons simplement un pas à pas pour l'entrée 70304:

  1. Dans la première itération récursive: n=70304, depth=1, remainder=70304%1 = 0.
    • Puisque depth < n est la vérité, il fera un appel récursif avec 70304-0 et 1*10
    • Et puisque remainder est 0, il n’ajoutera rien au résultat.
  2. Dans la deuxième itération récursive: n=70304, depth=10, remainder=70304%10 = 4.
    • Puisque depth < n est toujours vrai, il fera un appel récursif avec 70304-4 et 10*10
    • Et puisque remainder vaut 4, il va ajouter un " + " et ce 4 au résultat
  3. Dans la troisième itération récursive: n=70300, depth=100, remainder=70300%100 = 0.
    • Puisque depth < n est toujours vrai, il fera un appel récursif avec 70300-0 et 100*10
    • Et puisque remainder est 0, il n’ajoutera rien au résultat.
  4. Dans la quatrième itération récursive: n=70300, depth=1000, remainder=70300%1000 = 300.
    • Puisque depth < n est toujours vrai, il fera un appel récursif avec 70300-300 et 1000*10
    • Et puisque remainder vaut 300, un " + " et ce 300 seront ajoutés au résultat.
  5. Dans la cinquième itération récursive: n=70000, depth=10000, remainder=70000%10000 = 0.
    • Puisque depth < n est toujours vrai, il fera un appel récursif avec 70000-0 et 10000*10
    • Et puisque remainder est 0, il n’ajoutera rien au résultat.
  6. Dans la sixième itération récursive: n=70000, depth=100000, remainder=70000%100000 = 70000.
    • Étant donné que depth < n est maintenant falsey, il ne fera plus d'appels récursifs, mais renvoie plutôt la n actuelle (qui est 70000).

Et comme il s’agissait d’appels récursifs, nous devrions en fait regarder le résultat à l’envers, de sorte que le résultat sera 70000 + 300 + 4.

Donc en général:

  • Le depth < n if-check permet de savoir quand nous en avons terminé avec les appels récursifs.
  • g(n-remainder, depth*10) supprimera les chiffres déjà sortis lors d'une précédente itération récursive et passera aux 10 suivants.k pouvoir dans la prochaine itération récursive
  • Le remainder != 0 if-check détermine si le numéro que nous voulons ajouter n'était pas un 0
1
Kevin Cruijssen

Je pense que le problème de ce problème est d’omettre 0(zero) et d’extra + (plus) tout en parcourant le nombre. La fonction concat de chaîne peut être utilisée avec la condition suivante:

  public static String expandedForm(int num) {
    String st = String.valueOf(num);
    String finalResult = "";

    for (int i = 0; i < st.length(); i++) {
         String s = String.valueOf(st.charAt(i));
        if (Integer.valueOf(s) > 0) {
            for (int j = i; j < st.length() - 1; j++) {
                s = s.concat("0");
            }

            if (i == st.length() - 1) {
                finalResult = finalResult.concat(s);
            } else {
                finalResult = finalResult.concat(s + " + ");
            }       
        }
    }
    return finalResult;
}
0
Abdur Rahman
package backup;

import Java.util.Arrays;

public class FileOutput {

    public static void main(String[] args){

        String expForm = expandedForm(70304);
        //System.out.println(expForm);

    }

    public static String expandedForm(int num)
    {

      String[] str = Integer.toString(num).split("");
      String result = "";

      for(int i = 0; i < str.length-1; i++) {
        if(Integer.valueOf(str[i]) > 0) {
          for(int j = i; j < str.length-1; j++) {
            str[i] += '0';
          }
        }
      }

      result = Arrays.toString(str);
      result = result.substring(1, result.length()-1).replace(",", " +");
      System.out.println(result);

      return result;
    }
}

Sortie : 70000 + 0 + 300 + 0 + 4

Solution dans la plupart des boucles internes, vous devez ajouter '0' à str[i]: str[i] += '0';

Ensuite, vous devez remplacer "+ 0" dans la sortie obtenue.

0
Raj
for(int i = 0; i < str.length; i++) {
    if(Integer.valueOf(str[i]) > 0) {
        for(int j = 0; j < str.length - i - 1; j++) {
            str[i] += '0';
        }
    }
}  
0
Bartek