PHP BigInt?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

So langsam frage ich mich, wo die Challenge ist, wenn ich laufend deine Arbeit übernehme... :P

public class IbanTwister {
    public static void main(String args[]) {
        String iban = "DE80500105175408332501";
        //hier höngen wir die ersten 4 Zeichen hinten dran
        iban += iban.substring(0,4);
        //hier entfernen wir vorne die ersten 4 Zeichen
        iban = iban.substring(4,iban.length());
        //Array mit allen Zeichen die wir ersetzen wollen
        String[] buchstaben = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        //Jetzt durchlaufen wir das Array und ersetzen einfach jedes Zeichen mit der gewünschten Zahl.
        //A soll mit 10 ersetzt werden, B mit 11 usw. A ist im array an 0. Stelle, also ersetzen wir jedes Zeichen mit i+10 in der Schleife
        for (int i=0; i<buchstaben.length; i++) {
            iban = iban.replace(buchstaben[i], ""+(i+10));
            iban = iban.replace(buchstaben[i].toLowerCase(), ""+(i+10));
        }
        //String modulo int
        int rest = moduloWithString(iban, 97);
        //Welcher Rest bleibt?
        System.out.println(iban + " modulo 97 ergibt einen Rest von " + rest);
    }
    
    static int moduloWithString(String s, int a) {
        int rest = 0;
        for (int i=0; i<s.length(); i++) {
            rest=(rest * 10 + (int)s.charAt(i) - '0') % a;
        }
        return rest;
    }
}

Das auf PHP umwandeln. Die Modulo-Funktion sollte für PHP wohl ca so aussehen:

function moduloWithString($s, $a) {
    $rest = 0;
    for ($i=0; $i<$y=strlen($s);$i++) {
        $rest=($rest * 10 + $s[$i] - '0') % $a;
    }
    return $rest;
}

Allerdings habe ich ewig nichts in PHP gemacht, daher übernehme ich keine Garantie.


iNeedHelp961 
Beitragsersteller
 12.06.2022, 09:35

Haha. Das ist ja nur 5% der Challenge die IBAN ist nur ein Nebenteil. Das replacen hab ich diesmal gepackt nur das rechnen ... Uff. Danke dir!

0

2 möglichkeiten:

  1. mit dezimal wie das ein mensch machen würde ... sehr ineffizient. aber für eine einzige zahl gehts
  2. in zwei normale interger teilen, die vordere dividieren und den rest zur hinteren hinzurechnen (alles binär betrachtet). dann die hintere mit dem überlauf auch dividieren.

also quasi aaaaaaabbbbbbb / 97 = aaaaaa / 97, (gleitkommateil + bbbbbb / 97)

den gleitkommateil kannst mit geeigneten SHL wieder auf das bbbbb Format bringen


iNeedHelp961 
Beitragsersteller
 11.06.2022, 20:38

Ehhh ... Bin verwirrt. Also den String in der Mitte teilen und dann beide Teile durch 97?

0

https://stackoverflow.com/questions/68694954/how-do-divide-a-h-u-g-e-number-in-php

"Merkwürdig" hier steht die dasselbe Frage und Lösungen werden hier auch angeboten.

Woher ich das weiß:Berufserfahrung – Web Developer bei einem mittelständischen Portalbetreiber

iNeedHelp961 
Beitragsersteller
 11.06.2022, 20:34

bcmath ist auf der Seite leider nicht verfügbar ... Sorry, vergessen zu sagen.

1
TimeTravel3  11.06.2022, 20:49

Gutefrage ist leider nicht fähig genug zu Googeln.

0

im schlimmsten fall ein string daraus machen und wie man das auch auf einem blatt papier macht, geteilt durch rechnen .viel spass beim algo bau .