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).
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;
}
Vous pouvez les convertir en chaînes, les combiner puis les reconvertir en un int?
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 ...
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
.
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;
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.
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.
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);
}