web-dev-qa-db-fra.com

Combinez deux nombres en un. Exemple: 123 et 456 deviennent 123456

En C++, comment combiner (note: ne pas ajouter) deux entiers en un seul grand entier?

Par exemple:

int1 = 123;
int2 = 456;

Y at-il une fonction pour prendre les deux nombres et transformer intCombined dans 123456?

MODIFIER:

Mon mal pour ne pas expliquer clairement. Si int2 est 0, alors la réponse devrait être 123, pas 1230. En réalité, int1 (le nombre à gauche) n'aurait de valeur que si int2 dépasse la limite de 32 bits. Donc, quand int2 vaut 0, alors int1 vaut 0 (ou garbage, je ne suis pas sûr).

18
jiake

La puissance de dix, avec laquelle vous devez multiplier le premier nombre, est la plus petite, plus grande que le deuxième:

int combine(int a, int b) {
   int times = 1;
   while (times <= b)
      times *= 10;
   return a*times + b;
} 
19
sth

Vous pouvez les convertir en chaînes, les combiner puis les reconvertir en un int?

9
Jan Johansen

Si les nombres que vous essayez de combiner sont des entiers positifs, vous pouvez utiliser les fonctions de pairage .

La fonction de couplage crée un nombre unique à partir de deux. C'est aussi une fonction réversible.

x,y -> z
z -> x,y

z = (x+y)(x+y+1)/2 + y

Alors l'inverse est:

w = floor((sqrt(8z+1)-1)/2)
t = (w*w + w)/2
y = z - t
x = w - y

Remarque. Ce qui précède n'est dans aucune langue spécifique. Juste un peu de maths ...

7
Noel

Pour chaque chiffre dans int2, vous pouvez multiplier int1 par 10, puis ajouter int2:

// merge(123, 0) => 1230
int merge(int int1, int int2)
{
    int int2_copy = int2;
    do
    {
        int1 *= 10;
        int2_copy /= 10;
    } while (int2_copy);

    return int1 + int2;
}

Vous pouvez vous débarrasser de la boucle en utilisant log10 et ceil.

7

En supposant que les deux entrées soient non négatives, et que int1 soit à gauche et que int2 soit à droite, vous devez déterminer le nombre de chiffres que long int2 est, multiplier int1 par 10 un tas de fois, puis les ajouter.

unsigned int int1 = blah;
unsigned int int2 = blah;

unsigned int temp = int2;

do
{
    temp /= 10;
    int1 *= 10;
} while (temp >0)

unsigned int newInt = int1 + int2;
6
csj

Vous pouvez utiliser stringstream:

string Append(int _1, int _2){
    stringstream converter;

    converter << _1 << _2;

    return converter.str();
}

puis appelez atoi sur la chaîne retournée.

4
wheaties

Ce qui suit est essentiellement la solution acceptée par sth mais avec le correctif b == 0 et la boucle remplacée par une expression permettant de calculer directement l'échelle:

#include <math.h>

int combine(int a, int b) 
{
    int times = 1;
    if( b != 0 )
    {
        times = (int)pow(10.0, (double)((int)log10((double)b)) + 1.0);
    }
    return a * times + b ;
}

Dans certaines circonstances (comme une cible avec une FPU et une bonne bibliothèque mathématique), l'expression peut être plus rapide que la boucle, mais je n'ai pas testé cette hypothèse.

2
Clifford

Une autre option qui fonctionne pour C aussi:

#include <stdio.h>

int CombineInt(int int1, int int2)
{
  char cResult[32];

  sprintf(cResult, "%d%d", int1, int2);
  return atoi(cResult);
}
0
Juliano