Ich hab ein Problem. Ich will von einer ziemlich großen Zahl den Rest mithilfe von Modulo berechnen. Die Zahl ist abgespeichert in einem char string. (24-Stellen) char[0]='1' char[1]='4' . . . Hättet ihr einen Ansatz für mich?
Wie macht man das mit Dezimalrechnung, Bleistift und Papier? So programmieren.
Gast
#4873490
Lutz H. schrieb: > So programmieren. Eher nicht, jedenfalls wenn das nicht mal wieder irgendwelche Hausaufgaben sind oder man unbedingt "selber machen" will. Vernünftig wäre nämlich, nicht ständig das Rad neu zu erfinden und stattdessen eine bestehende Bibliothek für "big numbers" in der gewünschten Sprache zu benutzen. Für C wäre das z.B. GMP (gmplib.org).
Gast
#4873493
Ja, oder sich einfach auf eingebaute Typen verlassen. GCC kann folgendes, bei anderen Compiler funktioniert das ähnlich:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
Das ist nur ein Proof of Concept... ;)
Gast
#4873518
Restklassenring https://de.wikipedia.org/wiki/Restklassenring Danach kannst du die Zahl durch eine beliebige andere Zahl aus dem entsprechenden Restklassenring ersetzten. Beispiel: 13 % 4 Es spielt keine Rolle, ob du nun 13 % 4 oder 5 % 4 oder -3 % 4 rechnest, das Ergenis ist das selbe. Bei negativen Zahlen muss man in C/C++ aufpassen. Du musst also nur feststellen, in welchem Restklassenring sich deine Zahl befindet, und deine Zahl gegen eine andere aus dem Ring ersetzen.
Gast
#4873571
Hallo Tasi, willst Du durch irgendwelche Zahlen teilen, oder immer durch die Gleiche? Gruss Chregu
nocheinGast schrieb: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
> > Das ist nur ein Proof of Concept... ;) uint128_t habe ich noch nie von gehört. Aber mein Compiler kennt den Datentyp auch gar nicht. Oder wie implementiere ich den in das Programm?
Christian M. schrieb: > willst Du durch irgendwelche Zahlen teilen, oder immer durch die > Gleiche? Bei 24-stelliger Ausgangszahl würde ich mal vermuten: Immer die gleiche B-)
Für eine einfache Implementierung brauchst du folgende Grundarithmetik:
- Rechts-Schieben mit Carry ("mod 2" und "div 2" im Pseudo-Code)
- Links-Schieben ("2 *" im Pseudo-Code)
- Vergleich auf Größergleich " >= " und Ungleichheit " != "
- Addition " + " und Subtraktion " - "
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Tasi D. schrieb: > uint128_t habe ich noch nie von gehört. Aber mein Compiler kennt den > Datentyp auch gar nicht. Der Datentyp heisst ja auch
1 | |
und nicht
1 | |
und compiliert bei mir ohne Probleme mit dem GCC.
Tasi D. schrieb: > Aber mein Compiler kennt den > Datentyp auch gar nicht biginteger oder ähnliches, große Zahlen sind erst seit 2014 bekannt.
Kaj G. schrieb: > Der Datentyp heisst ja auch __uint128_t und nicht uint128_t > und compiliert bei mir ohne Probleme mit dem GCC. GCC unterstützt die 128 Bit-Typen aber nicht für jedes Target. Wenn du für ein 64 Bit-Zielsystem baust, sollten sie aber immer dabei sein.
Gast
#4873892
Rainer B. schrieb: > Christian M. schrieb: >> willst Du durch irgendwelche Zahlen teilen, oder immer durch die >> Gleiche? > > Bei 24-stelliger Ausgangszahl würde ich mal vermuten: Immer die gleiche > B-) wohl noch durch 10^n :-)) Gruss Chregu
Ich tippe eher auf 97 https://www.iban.de/iban-pruefsumme.html
Wenn die Zahl in einem String gespeichert ist und der Modul wirklich so klein ist, dann ist die Hin- und Herwandlung zu 128-Bit int bereits fast mehr Aufwand als den Rest zu berechnen :-) Beispiel in C99, das mit auf einem "normalen" PC mit 32-Bit int immerhin für Moduln bis 429496729 taucht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Dabei steht die Zahl als little-endian in String digits[], d.h. die kleinste Stelle kommt zuerst. 120 ist also dargestellt durch "021". Und für big-endian ist's genauso einfach:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Gast
#4875105
Hier eine Bibliothek für .Net http://www.sse-web.de/downloads/c-klassenbibliothek-uint8192/
MH schrieb: > Hier eine Bibliothek für .Net > > http://www.sse-web.de/downloads/c-klassenbibliothek-uint8192/ Man kann auch die Klasse BigInteger aus der .NET-Klassenbibliothek verwenden. Aber auch hier gilt (erst recht) der Einwand von Johann: Wenn der Modul im normalen Integer-Format darstellbar ist und mit der Zahl nicht noch weitere Berechnungen ausgeführt werden müssen, ist es wohl besser, direkt auf der ASCII-Darstellung der Zahl zu operieren.
Gast
#4875412
Yalu X. schrieb: > ist es > wohl besser, direkt auf der ASCII-Darstellung der Zahl zu operieren Das lernt halt heute keiner mehr, aber man kann ja nach schriftlicher Division googeln, so schwer zu begreifen ist das nicht. Georg
Gast
#4877358
Rechenknecht schrieb: > Für C wäre das z.B. GMP (gmplib.org). Ja da bin ich auch draufgekommen durch: https://runtimebasic.net/Projekt:BigNum Ist ein Stand-Alone-Programm. Vielleicht was für den TO. Gruss Chregu
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.