/** * Copyright (c): Uwe Schmidt, FH Wedel * * You may study, modify and distribute this source code * FOR NON-COMMERCIAL PURPOSES ONLY. * This copyright message has to remain unchanged. * * Note that this document is provided 'as is', * WITHOUT WARRANTY of any kind either expressed or implied. */ /** * @author Uwe Schmidt * * Klasse fuer Kinderabzaehlspiel * piep,1,2,3,4,5,6,piep,8,9,10,11,12,13,piep,15,piep,piep,18 * * a) Zahl Vielfaches von 7 * b) Ziffer 7 kommt in der Zahl vor * c) die Quersumme oder die Quersumme der Quersumme * oder ... ist 7 */ //-------------------- public class Piep { //-------------------- /** * die Ziffer mit der das Spiel gespielt wird */ public final int ziffer; /** * die Basis zu der gespielt wird */ public final int basis; //-------------------- /** * ein Piep Spiel erzeugen mit Ziffer und Basis * default Basis ist 10 * default Ziffer ist 7 */ public Piep(int ziffer, int basis) { if ( basis < 2 ) throw new IllegalArgumentException("Illegaler Wert fuer Basis: " + basis); if ( ziffer < 1 || ziffer >= basis ) throw new IllegalArgumentException("Illegaler Wert fuer Ziffer: " + ziffer); this.ziffer = ziffer; this.basis = basis; } public Piep(int ziffer) { this(ziffer,10); } public Piep() { this(7); } //-------------------- /** * a) * n wird von ziffer geteilt: * 0,7,14,21,... * b) * ziffer in n: * 7,17,27,37,...,70,71,... * c) * quersumme(n) = ziffer: * 7,16,25,34,...,70,79->16->7,88->16->7,... */ public boolean piep(int n) { if ( n < 0 ) throw new IllegalArgumentException("Illegaler Wert fuer n: " + n); return zifferTeilt(n) || zifferIn(n) || querSumme(n) == ziffer; } //-------------------- private boolean zifferTeilt(int n) { return n % ziffer == 0; } //-------------------- /** * letzte Ziffer testen: n % basis * n mehrstellig * restliche Ziffern durchsuchen */ private boolean zifferIn(int n) { return ( n % basis == ziffer ) || ( ( n >= basis ) && zifferIn(n / basis) ); } //-------------------- /** * n 1-stellig * querSumme(n) = n * * n mehrstellig * querSumme(n) = quersumme(n / 10) + n % 10 * * quersumme(n) mehrstellig * quersumme(n) == quersumme(quersumme(n)) * * hier kann der innere Aufruf weggelassen werden: * quersumme(quersumme(n / 10) + n % 10) = * quersumme(n / 10 + n % 10) * * --> ein wenig Zahlentheorie */ private int querSumme(int n) { return ( n < basis ) ? n : querSumme(n / basis + n % basis); } } //--------------------