


Sehr schönDaveX hat geschrieben:Ja sehr gerne. Sobald ich mich in diesem Bereich noch tiefer eingearbeitet habe, liebend gerne.![]()
![]()
*daumen hoch*DaveX hat geschrieben:Ja sehr gerne. Sobald ich mich in diesem Bereich noch tiefer eingearbeitet habe, liebend gerne.![]()
![]()
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
const char Literals[] = "abcdefghijklmnopqrstuvwxyz";
const unsigned NLiterals = sizeof( Literals) - 1;
int main()
{
const char TestString[] = "caaaaaaaaaaa"; // Mit diesem String kommt es schon zu einem falschen Index
// obwohl der Index deutlich unter 18446744073709551615U liegt!
size_t StrLgth = strlen( TestString );
int pos[64] = { 0 }; // Zum indexieren der Zeichen in Literals[]
int LitAsNum[17] = { 0 }; // Zur Speicherung der gemappten Zeichen in TestString[]
uint64_t Index = 0U; // String-Index
int MinCount = StrLgth; // Zur Berechnung des String-Indexes
for( unsigned i = 0; i < NLiterals; i++ )
pos[( int )Literals[i]] = i; // Zeichen in Literals[] indexieren
for( unsigned i = 0; i < StrLgth; i++ )
LitAsNum[i] = pos[( int )TestString[i]]; // Zeichen in TestString[] mappen und speichern
/*
* Hier wird nun der Index des Strings berechnet.
*/
for( unsigned i = 0; i < StrLgth; i++ )
{
Index += pow( NLiterals, MinCount-1 ) * LitAsNum[i];
MinCount--;
if( MinCount == 0 )
Index += 1;
}
/*
* Hier werden alle Möglichkeiten mit weniger Stellen hinzu addiert.
*/
for( unsigned i = 1; i < StrLgth; i++ )
Index += pow( NLiterals, i );
printf( "Index = %ju\n", Index );
return 0;
}
Code: Alles auswählen
Index += pow( static_cast<long double>( NLiterals ), static_cast<long double>( MinCount-1) ) * LitAsNum[i];
Code: Alles auswählen
uint64_t pow_u64( uint64_t base, uint64_t pow )
{
if( pow == 0 )
return 1;
if( pow < 0 )
return 0; // No negative power is an integer
uint64_t result = 1;
for( uint64_t i = 0; i < pow; i++ )
result *= base;
return result;
}
pow kann nicht negativ sein, da Du ein uint verlangst.DaveX hat geschrieben:Vielen Dank für deine Antwort. Ich habe nun folgendes gemacht:Code: Alles auswählen
uint64_t pow_u64( uint64_t base, uint64_t pow ) { ... if( pow < 0 ) return 0; // No negative power is an integer }
Darf ich fragen, warum Du den Index im Dezimalsystem verwendest? Vielleicht bietet sich zum Beispiel das 26er-Zahlensystem verwendest und als Ziffern könntest Du dann die Buchstaben verwenden? Daraus würde sich eine vergleichsweise einfache Abbildung ergeben...DaveX hat geschrieben:Das funktioniert soweit. Werde aber für mein Vorhaben womöglich das hier nutzen müssen: https://gmplib.org/.
Dankeschön.
Könntest du mir ein kleines Beispiel zeigen, wie du das genau meinst? Habe es nicht ganz verstanden. Klingt aber Interessant. Mir fiel eben keine Alternative ein, wie ich das sonst machen sollte als den Index im Dezimalsystem anzuzeigen bzw. auszugeben.Xin hat geschrieben:Darf ich fragen, warum Du den Index im Dezimalsystem verwendest? Vielleicht bietet sich zum Beispiel das 26er-Zahlensystem verwendest und als Ziffern könntest Du dann die Buchstaben verwenden? Daraus würde sich eine vergleichsweise einfache Abbildung ergeben...