Si se refiere a los caracteres de los números (como 1927 y 9721), hay (al menos) un par de enfoques.
Si se le permitió ordenar, un enfoque es simplemente sprintf
en dos búfers, ordenar los caracteres en los búferes, luego ver si las cadenas son iguales.
Sin embargo, dada su deseo de no Ordenar los dígitos, otra alternativa es la creación de un conjunto de diez elementos, con todos los elementos establecidos inicialmente a cero, entonces el proceso cada dígito en el primer número, incrementando el elemento relevante .
Luego haga lo mismo con el segundo número pero decrementando.
Si, al final, sigue siendo todo ceros, los números eran una permutación entre sí.
Esto es eficiente ya que es un algoritmo O(n)
donde n
es el número de dígitos en los dos números. El pseudo-código para una bestia tan sería algo así como:
def arePermutations (num1, num2):
create array count, ten elements, all zero.
for each digit in num1:
increment count[digit]
for each digit in num2:
decrement count[digit]
for each item in count:
if item is non-zero:
return false
return true
En C, el siguiente programa completo ilustra cómo se puede hacer esto:
#include <stdio.h>
#include <stdlib.h>
#define FALSE (1==0)
#define TRUE (1==1)
int hasSameDigits (long num1, long num2) {
int digits[10];
int i;
for (i = 0; i < 10; i++) // Init all counts to zero.
digits[i] = 0;
while (num1 != 0) { // Process all digits.
digits[num1%10]++; // Increment for least significant digit.
num1 /= 10; // Get next digit in sequence.
}
while (num2 != 0) { // Same for num2 except decrement.
digits[num2%10]--;
num2 /= 10;
}
for (i = 0; i < 10; i++)
if (digits[i] != 0) // Any count different, not a permutation.
return FALSE;
return TRUE; // All count identical, was a permutation.
}
int main (int c, char *v[]) {
long v1, v2;
if (c != 3) {
printf ("Usage: %s <number1> <number2>\n", v[0]);
return 1;
}
v1 = atol (v[1]);
v2 = atol (v[2]);
if (hasSameDigits (v1, v2)) {
printf ("%d and %d are permutations\n", v1, v2);
} else {
printf ("%d and %d are not permutations\n", v1, v2);
}
return 0;
}
Simplemente pase dos números (positivos) y, suponiendo que encajen en un long
, le dirá si tienen el mismo número de dígitos.
¿cómo puede un número ser una permutación de otro? ¿Estamos hablando de la cadena de dígitos en la base 10? Los dígitos 1-4-1 no son lo mismo que el número 141. – jalf
también se puede pensar de esa manera. –
Esto es esencialmente un chequeo de anagrama. – polygenelubricants