Se si intende i caratteri dei numeri (come 1927 e 9721), ci sono (almeno) un paio di approcci.
Se ti è stato permesso di ordinare, un approccio è semplicemente quello di aggiungere sprintf
a due buffer, ordinare i caratteri nei buffer, quindi verificare se le stringhe sono uguali.
Tuttavia, dato il tuo desiderio di non ordinare le cifre, un'altra alternativa è impostare un array di dieci elementi, con tutti gli elementi inizialmente impostati su zero, quindi elaborare ogni cifra nel primo numero, incrementando l'elemento pertinente .
Quindi fare lo stesso con il secondo numero ma decrementare.
Se, alla fine, sono ancora tutti zeri, i numeri erano una permutazione reciproca.
Ciò è efficiente in quanto è un algoritmo O(n)
in cui n
è il numero di cifre nei due numeri. Lo pseudo-codice per una bestia sarebbe qualcosa di simile:
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
In C, il seguente programma completo illustra come questo può essere fatto:
#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;
}
Semplicemente passare due numeri (positivi) e, supponendo che si adattino a un long
, ti dirà se hanno lo stesso numero di cifre.
come può un numero essere una permutazione di un altro? Stiamo parlando della stringa di cifre in base-10? Le cifre 1-4-1 non sono le stesse del numero 141. – jalf
puoi anche pensarlo in questo modo. –
Questo è essenzialmente un controllo anagramma. – polygenelubricants