Ja, das sieht echt clever aus, vor allem die imponierende for-Schleife. Allerdings funktioniert es irgendwie nicht richtig. Da mein asuro die stdio.h nicht richtig anwendet habe ich versucht, das Programm anzupassen:
Code:
#include "asuro-probot.h"
#include "asuro-probot.c"
//#include <stdio.h>
//#include <string.h>
#define DIGITS "1234567890ABCDEF"
int print_perm (unsigned int N, unsigned int n0)
{
char *l, letters[] = DIGITS;
int j, digit[N];
unsigned int n = n0;
unsigned int i;
// n0 in faktorielle Darstellung umwandeln
for (i = 1; i <= N; i++)
{
digit[i-1] = n % i;
n /= i;
//while(!(UCSRA & 0x20));
//UDR = digit[i-1]+'0';
}
//SerWrite("\r\n\n",3);
if (n)
return 0;
// n0-te Permutation ausdrucken
//printf ("#%d: ", n0 + 1);
PrintInt(n0+1);
SerWrite(": ",2);
for (i = N-1; i >= 0; i--)
{
for (j = -1, l = letters - 1; j < digit[i]; j += *++l != ' ');
//printf ("%c", *l);
while(!(UCSRA & 0x20)); // Warten bis USART fertig ist
//UDR = *l; // Wert an Adresse l senden
UDR = *l+'0'; // Wert an Adresse l als Ascii-Zeichen senden
//UDR = i+'0'; // i als Ascii-Zeichen senden
// Gedruckte Zeichen aus Liste entfernen
*l = ' ';
}
//printf ("\n");
SerWrite("\r\n",2); // neue Zeile
return 1;
}
int main (void)
{
unsigned int n=0, N=3;
/* printf ("\nAnzahl Zeichen: ");
scanf ("%u", &N);
printf ("\nPermutation Nr. (0 fuer alle): ");
scanf ("%u", &n);
if (N == 0 || N > strlen (DIGITS))
{
printf ("Ungueltige Eingabe: Anzahl Zeichen in 1..%d\n",
strlen (DIGITS));
return 1;
}
*/
SerWrite("\r\n\n",3); // neue Zeile
if (n)
print_perm (N, n-1);
else
while (print_perm (N, n++));
while(1);
return 0;
}
Die Ausgabe:
Code:
1 : 123R 6Eƈ "¤ "×" ˆ Cø (usw....)
Liegts an mir oder am Programm?
Gruß
mic
[Edit]
Die Lösung sollte doch so aussehen:
Beispiel mit N = 3, n = 0
#1: 123
#2: 132
...
#720: 098
Lesezeichen