# ISBN



## derHulki (19. Mai 2015)

*Schreiben sie eine Methode, die zu einer 9stellingen Zahl die passsende Prüfziffer generiert, sodass eine 10-stellige ISBN-Nummer ensteht*.

Beispiel: Gegebn ist die Zahl 312734371

= (1·3 + 2·1 + 3·2 + 4·7 + 5·3 + 6·4 + 7·3 + 8·7 + 9·1) mod 11 = 10
Bei 10 soll ein X zurückgegeben werden, ansonsten der Wert.

Hier mein Code, irgendwie kommt immer 0 raus.


```
public class Ue8auf1 {
public String calculatreISBNCheckDigit(long n ){
    
    long q = 0;
    String s = "";
    for(int i=9; i>=0;i--){
        q =  n%10;
        q= q*i  ;
    } q = q%11;
    if(q == 10){
        return "X";
    }else {
        return String.valueOf(q);
    }
    }
    

public static void main(String[]args){
    Ue8auf1 a = new Ue8auf1();
    System.out.println(a.calculatreISBNCheckDigit(312734371));
}
}
```

mfg


----------



## Maggot (19. Mai 2015)

Du überschreibst ständig q. Schau dir noch einmal den algorithmus an. Geh ihn schritt für schritt durch.


----------



## Robinson97 (19. Mai 2015)

Es wäre für dich leichter die Aufgabe mit einem Array zu lösen


----------



## Dompteur (19. Mai 2015)

Robinson97 hat gesagt.:


> Es wäre für dich leichter die Aufgabe mit einem Array zu lösen


Dem möchte ich widersprechen. Bei dieser Aufgabe braucht man kein Array.


----------



## derHulki (19. Mai 2015)

Ok ich denke ich habs:

[Java]
public class Ue8auf1 {
public String calculatreISBNCheckDigit(long n ){
    if(n < 100000000 || n > 999999999){
        return null;
    }
    long n1 = n;
    int q = 0;
    int erg = 0;
    for(int i=9; i>0;i--){
        q =  (int) n%10;
        q = q*i; 
        erg += q;
    n /=10;
    }  erg = erg%11;
    if(erg == 10){
        return String.valueOf(n1) + "X";
    }else {
        return String.valueOf(n1)+ String.valueOf(erg);
    }
    }


public static void main(String[]args){
    Ue8auf1 a = new Ue8auf1();
    System.out.println(a.calculatreISBNCheckDigit(312734371));
}
}
[/code]

Gibt es noch Verbesserungsvorschläge?






Robinson97 hat gesagt.:


> Es wäre für dich leichter die Aufgabe mit einem Array zu lösen



Wie würde den die Lösung mit einem Array aussehen?

mfg


----------



## Dompteur (20. Mai 2015)

derHulki hat gesagt.:


> Wie würde den die Lösung mit einem Array aussehen?


Ein Array wäre sinnvoll, wenn deine Gewichte nicht 1,2,3,4... wären, sondern irgendwie durcheinandergemischt.
Da aber bei dir das Gewicht aus der Positionsnummer ableitbar ist, brauchst du es hier nicht.


----------



## Flown (20. Mai 2015)

Verbesserungsvorschläge sind eigentlich nicht da, außer das man den Code ein wenig verkürzen kann:

```
private static String isbnCheck(int nr) {
  int checkDigit = 0;
  for (int i = 9, n = nr; i > 0; i--, n /= 10) {
    checkDigit += i * (n % 10);
  }
  checkDigit %= 11;
  return String.valueOf(nr) + (checkDigit == 10 ? "X" : String.valueOf(checkDigit));
}
```


----------



## derHulki (20. Mai 2015)

Ok gut, das sieht doch um einiges besser aus


----------



## Robinson97 (20. Mai 2015)

derHulki hat gesagt.:


> Wie würde den die Lösung mit einem Array aussehen?
> 
> mfg



Also ich hatte das so gemacht:


```
int zaehler2 = 10, ergebnis=0, pruefziffer=0;
        int [] isbn = new int[9];
        Scanner sc1 = new Scanner(System.in);
        for(int i=0;i<9;i++)
        {
            System.out.println("Die "+(i+1)+". Zahl: ");
            isbn[i]= sc1.nextInt();
        }
        for(int i=0;i<9;i++)
        {
            ergebnis=ergebnis+isbn[i]*zaehler2;
            zaehler2--;
        }
        pruefziffer=11-ergebnis%11;
        if(pruefziffer == 10){
            System.out.print("Die Prüfziffer ist X");
        }
        else{
         System.out.print("Prüfziffer: "+pruefziffer);
         }
```

Mir war es leichter gefallen es mit arrays zu machen


----------

