homeduke Prof. Dr. Uwe Schmidt FH Wedel

Die Datei: Piep.java


weiter
   1/**
   2 * @author Uwe Schmidt
   3 *
   4 * Klasse fuer Kinderabzaehlspiel
   5 * piep,1,2,3,4,5,6,piep,8,9,10,11,12,13,piep,15,piep,piep,18
   6 *
   7 * a) Zahl Vielfaches von 7
   8 * b) Ziffer 7 kommt in der Zahl vor
   9 * c) die Quersumme oder die Quersumme der Quersumme
  10 *    oder ... ist 7
  11 */
  12
  13//--------------------
  14
  15public
  16class Piep {
  17
  18  //--------------------
  19
  20  /**
  21   * die Ziffer mit der das Spiel gespielt wird
  22   */
  23  public final
  24  int ziffer;
  25
  26  /**
  27   * die Basis zu der gespielt wird
  28   */
  29  public final
  30  int basis;
  31
  32  //--------------------
  33
  34  /**
  35   * ein Piep Spiel erzeugen mit Ziffer und Basis
  36   * default Basis ist 10
  37   * default Ziffer ist 7
  38   */
  39
  40  public
  41  Piep(int zifferint basis) {
  42    if ( basis < 2 )
  43      throw
  44        new IllegalArgumentException("Illegaler Wert fuer Basis: " + basis);
  45
  46    if ( ziffer < 1 || ziffer >= basis )
  47      throw
  48        new IllegalArgumentException("Illegaler Wert fuer Ziffer: " + ziffer);
  49
  50    this.ziffer = ziffer;
  51    this.basis = basis;
  52  }
  53
  54  public
  55  Piep(int ziffer) {
  56    this(ziffer,10);
  57  }
  58
  59  public
  60  Piep() {
  61    this(7);
  62  }
  63
  64  //--------------------
  65
  66  /**
  67   * a)
  68   *    n wird von ziffer geteilt:
  69   *    0,7,14,21,...
  70   * b)
  71   *    ziffer in n:
  72   *    7,17,27,37,...,70,71,...
  73   * c)
  74   *    quersumme(n) = ziffer:
  75   *    7,16,25,34,...,70,79->16->7,88->16->7,...
  76   */
  77
  78  public
  79  boolean piep(int n) {
  80    if ( n < 0 )
  81      throw
  82        new IllegalArgumentException("Illegaler Wert fuer n: " + n);
  83
  84    return
  85      zifferTeilt(n)
  86      ||
  87      zifferIn(n)
  88      ||
  89      querSumme(n) == ziffer;
  90  }
  91
  92  //--------------------
  93
  94  private
  95  boolean zifferTeilt(int n) {
  96    return
  97      n % ziffer == 0;
  98  }
  99
 100  //--------------------
 101
 102  /**
 103   * letzte Ziffer testen: n % basis
 104   * n mehrstellig
 105   *   restliche Ziffern durchsuchen
 106   */
 107
 108  private
 109  boolean zifferIn(int n) {
 110    return
 111      ( n % basis == ziffer )
 112      ||
 113      ( ( n >= basis )
 114        && zifferIn(n / basis) );
 115  }
 116
 117  //--------------------
 118
 119  /**
 120   * n 1-stellig
 121   *   querSumme(n) = n
 122   *
 123   * n mehrstellig
 124   *   querSumme(n) = quersumme(n / 10) + n % 10
 125   *
 126   * quersumme(n) mehrstellig
 127   *   quersumme(n) == quersumme(quersumme(n))
 128   *
 129   * hier kann der innere Aufruf weggelassen werden:
 130   *   quersumme(quersumme(n / 10) + n % 10) =
 131   *   quersumme(n / 10 + n % 10)
 132   *
 133   *   --> ein wenig Zahlentheorie
 134   */
 135
 136  private
 137  int querSumme(int n) {
 138    return
 139      ( n < basis )
 140      ? n
 141      : querSumme(n / basis + n % basis);
 142  }
 143}
 144
 145//--------------------

Die Quelle: Piep.java


Letzte Änderung: 05.05.2014
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel