# Bestimmte Zahlen ausgeben



## Blin4ik (24. Feb 2011)

Ich habe folgende Aufgabe und zwar soll ich eine 9 stellige zahl ausgeben
die die zahlen von 1-9 besitzen (ohne 0).
das knifflige dabei ist dass nur eine zahl nur einmal vorkommen darf.

Und das die erste stelle n durch die n anzahl teilbar sein muss (ohne rest)

also z.b. die zahlen 123456789
1 / 1 = 1 ist teilbar
2 / 1 = 2
..
2 / 2 = 1
3 / 2 = 1,5 <- fail darf nicht verwendet werden die "3" an der 2ten stelle

ich habe erstmal ein array angelegt mit 9 und schon eine for schleife versucht etc.
aber ich kriegs einfach net hin :/ könnte mir jmd nen guten ansatz liefern, es ist echt wichtig


----------



## Tomate_Salat (24. Feb 2011)

Hattet ihr schon Listen/Vectoren, Maps?
Zeig doch mal deinen Anfang, den du bisher hast.


----------



## XHelp (24. Feb 2011)

So ganz verstehe ich die Aufgabenstellung nicht. Durch die Teilerbar-Bedingung kommt ja nur die 9 an 1. Stelle in Frage. Und wenn du *eine* Zahl ausgeben musst:

```
System.out.println(987654321);
```


----------



## chalkbag (24. Feb 2011)

Ist die Frage ob dein Lehrer das iterativ oder rekursiv will.

An sich klingt das mit dem Array schon gut, evtl noch eine ArrayList, in welcher du dir bereits gefunde Zahlen merkst.


----------



## Andi_CH (24. Feb 2011)

Blin4ik hat gesagt.:


> Ich habe folgende Aufgabe und zwar soll ich eine 9 stellige zahl ausgeben
> die die zahlen von 1-9 besitzen (ohne 0).
> das knifflige dabei ist dass nur eine zahl nur einmal vorkommen darf.
> 
> ...


----------



## Tomate_Salat (24. Feb 2011)

ich denke er meint das so: Ich nehme mal ein kürzeres beispiel(3stellig) xyz
x/1
y/2
z/3
jz darf keiner der rechnungen einen Rest ergeben.


----------



## HoaX (24. Feb 2011)

Hä? Ich versteh die Aufgabenstellung nicht, gehts auch genauer? Wie soll das funktionieren mit dem Teilen, das ist nicht klar was du da ausdrücken willst.

Zur Not probier halt die 3,6 Millionen Möglichkeiten durch und prüfe ob diese sich an deine Regeln halten oder nicht.

Edith sagt: Ihr habt auch grad alle Mittagspause, ne?


----------



## HoaX (24. Feb 2011)

Tomate_Salat hat gesagt.:


> ich denke er meint das so: Ich nehme mal ein kürzeres beispiel(3stellig) xyz
> x/1
> y/2
> z/3
> jz darf keiner der rechnungen einen Rest ergeben.



Dann könnte ja nur die 1 ganz vorne stehen, da sonst 0,x raus käme, und so weiter, d.h. die einzige Lösung wäre 123456789?! Das kanns doch nicht sein ...


----------



## Tomate_Salat (24. Feb 2011)

HoaX hat gesagt.:


> Edith sagt: Ihr habt auch grad alle Mittagspause, ne?



Komme gerade daraus 

Hier mal etwas, was vllt die Aufgabenstellung erklärt (wenn ich sie richtig verstanden habe):


```
public class Generator 
{
	public static void main(String[] args) 
	{
		for(int i=1;i<=9;i++) {
			System.out.print(i + ") ");
			for(int j=1;j<=9;j++) {
				if(j%i==0)
					System.out.print(j + " ");
			}
			System.out.println();
		}
	}
}
```

Ausgabe

```
1) 1 2 3 4 5 6 7 8 9 
2) 2 4 6 8 
3) 3 6 9 
4) 4 8 
5) 5 
6) 6 
7) 7 
8) 8 
9) 9
```

wenn man mal alle Zahlen die festehen vom Ergebnis wegnimmt:

```
1) 1 
2) 2  
3) 3  
4) 4 
5) 5 
6) 6 
7) 7 
8) 8 
9) 9
```

dürfte eigentl. nur 123456789 in Frage kommen :-/

=> Euer lehrer ist ein witzbold


----------



## Andi_CH (24. Feb 2011)

Tomate_Salat hat gesagt.:


> ich denke er meint das so: Ich nehme mal ein kürzeres beispiel(3stellig) xyz
> x/1
> y/2
> z/3
> jz darf keiner der rechnungen einen Rest ergeben.



Also kann an 9. Stelle nur die 9 stehen, denn es gibt keine andere Ziffer die durch 9 teilbar ist
An 8. Stelle nur die 8 --- seh ich es falsch oder gibt es genau eine einzige Lösung?

123456789

Ausserdem denke ich dass dieses Problemchen so schulmässig durchaus durch brute force gelöst werden kann. Es sind IMHO 362880 Möglichkeiten, da ja jede Ziffer nur einmal vorkommen darf.


----------



## Tomate_Salat (24. Feb 2011)

Andi_CH hat gesagt.:


> Also kann an 9. Stelle nur die 9 stehen, denn es gibt keine andere Ziffer die durch 9 teilbar ist
> An 8. Stelle nur die 8 --- seh ich es falsch oder gibt es genau eine einzige Lösung?
> 
> 123456789



jup, außer ich habe die Aufgabenstellung falsch verstanden.


----------



## Andi_CH (24. Feb 2011)

Heureka - ich war ohne programmieren schneller :toll: 




Tomate_Salat hat gesagt.:


> jup, außer ich habe die Aufgabenstellung falsch verstanden.


Das ginge dann wohl der Mehrheit hier so


----------



## Gonzo17 (24. Feb 2011)

Ehrlich gesagt.. so richtig verstehe ich es auch nicht. Aber wenn ich versuche es zu verstehen, dann würde ich behaupten, dass es ein paar wenige Zahlen gibt (keine Garantie, vll hab ich was übersehen), die diese Bedingungen erfüllen.



Blin4ik hat gesagt.:


> Ich habe folgende Aufgabe und zwar soll ich eine 9 stellige zahl ausgeben
> die die zahlen von 1-9 besitzen (ohne 0).



Du meinst wohl die Ziffern 1-9.



Blin4ik hat gesagt.:


> das knifflige dabei ist dass nur eine zahl nur einmal vorkommen darf.



Meinst du damit, dass nur eine Ziffer nur einmal vorkommen darf und alle anderen Ziffern mind. 2 Mal in der Zahl vorkommen müssen? Zum Beispiel 112233455



Blin4ik hat gesagt.:


> Und das die erste stelle n durch die n anzahl teilbar sein muss (ohne rest)
> 
> also z.b. die zahlen 123456789
> 1 / 1 = 1 ist teilbar
> ...



Meinst du damit, dass die Ziffer an der Stelle n durch n teilbar sein muss? Ziffer an n-ter Stelle durch n darf keinen Rest ergeben?

Falls dem wirklich so ist muss eine Zahl ja so aussehen. Da an fünftiger bis neunter Stelle jeweils nur eine Ziffer stehen kann, die durch die Stelle teilbar ist, muss die Zahl zB so aussehen 112256789. Oder 566856789. Aber wie du siehst ist damit die erste Bedingung nicht erfüllt. Eine Ziffer muss mind. zweimal vorkommen, wenn sie vorkommt, bis auf eine Ausnahme. Sprich: Stelle 5 bis 9 sind von genau diese Ziffern belegt, vier dieser Ziffern müssen aber so auf die ersten vier Stellen gelegt werden, dass beim dividieren durch die Stelle n kein Rest übrig bleibt.

Mögliche Lösung: 569856789. 5 / 1 ergibt keinen Rest, 6 /2 ebenso wenig wie 9 / 3 oder 8 / 4.
Ebenso möglich wäre 769856789.


----------



## Marco13 (24. Feb 2011)

```
for (int i=100000000; i<1000000000; i++)
{
    if (passt(i)) System.out.println(i);
}
```

(Über Effizienz und geschickte Implementierungen wurde ja nichts gesagt  )


----------



## Blin4ik (24. Feb 2011)

ok wie ich sehe haben das ne menge leute hier nicht kapiert ich erkläre es nochmal.

Also es wird einer Zahl (oder mehrere?) gesucht die 9stellig ist.
Und in dieser 9Stelligen zahl darf eine Zahl nur *einmal *vorkommen.
(von 1-9 aber keine 0) 

und man geht so vor das die erste zahl geteilt wird an der stelle wo sie grad steht also durch 1 wenn es die erste stelle ist. (z.b. 4 / 1 = 4)
danach kommt die zweite zahl die an zweiter stelle steht, hier wird die zweistellige zahl durch 2 geteilt (da sie an zweiter stelle steht, also z.b. 42/2 = 21) und das geht bis 9 weiter

und es darf nur eine Zahl sein die kein Rest aufweist beim teilen
wie z.b. 41/ 2 = 20 rest 1, d.h. dass die zahl 1 an zweiter stelle nicht funktioniert weil diese ungerade ist.

und die gesamte zahl soll am ende ausgegeben werden die sich in der reihenfolge teilen lässt,

die 1ste zahl lässt sich durch alles teilen, weil durch 1 geteilt wird, die 5fte stelle muss auch eine 5 sein, da dies die einzige möglichkeit ist dass kein rest ensteht (da keine 0 verwendet werden darff)

hoffentlich konnt ich es jetzt besser erklären und es sollte schon möglichst geschickt gemacht werden

ach und es ist keine hausaufgabe, diese aufgabe habe ich von einem abteilungsleiter in anwendungsentwicklung bekommen


----------



## Stapf_JAVA (24. Feb 2011)

Ich würde jede Ziffer einzeln anhängen und mir die Kombinationen die zutreffen (= für welche die Bedingung gilt) in einem Array speichern. Für jeden neuen Schritt dann nur noch die Vorgänger testen...So wird das Araay mit den Lösungen immer kleiner....


----------



## Tomate_Salat (24. Feb 2011)

```
public class Generator 
{
	public static void main(String[] args) 
	{
		for(int i=123456789;i<=987654321;i++) {
			if(passt(i))
				System.out.println(i);
		}
	}
	
	public static boolean passt(int zahl) {
		String str = String.valueOf(zahl);
		
		for(char c='1';c<='9';c++) {
			if(!str.contains(String.valueOf(c)))
				return false;
		}
		
		for(int i=2;i<=9;i++) {
			String sub = str.substring(0,i);
			if(Integer.valueOf(sub)%i!=0)
				return false;
		}
		
		return true;
	}
}
```

von Marco's Lösungsidee abgeschaut feif:

----
ist Stinklahm, sollte man Multithreading einbauen . Eine Zahl habe ich schon:
[c]381654729[/c]
----
fertig: ist btw auch die einzigste


----------



## Blin4ik (24. Feb 2011)

ich hab den code mal ausprobiert wenn ich es starte kommt einfach nur der schwarzebildschirm ohne iwelche werte ^^


----------



## Tomate_Salat (24. Feb 2011)

nur so damit du dich orientieren kannst, ich habe ihn mal rennen lassen(er rennt immernoch) mit Zeitangaben:
[c]381654729 - Gefunden nach 68 Sekunden[/c]
Also übe dich in Gedult 
----

```
381654729 - Gefunden nach 68 Sekunden
Dauer: 213 Sekunden
```


----------



## Andi_CH (24. Feb 2011)

EDIT - erst mal lesen .....


----------



## Blin4ik (24. Feb 2011)

guuut, es funktioniert nur wäre es irgendwie betrug wenn ich den jetzt verwenden würde, 
und ich bin kein profi in java deswegen würde ich mich ein bisschen über die erklärung freuen, viele sachen die da stehn hab ich wirklich noch nie gesehen ^^ 

wenn ich jetzt weiter dran rumsitzen würde wär das viel länger voller schleifen und arrays aber nicht mal da weiß ich in mom wie ich da vorgehen soll

@Andi_CH

nicht die 1 wird geteilt sondern die 381


----------



## Tomate_Salat (24. Feb 2011)

wenn du mir sagst, wo du was nicht verstehst, erkläre ich es gerne....allerdings gibt es sicherlich besser, wesentlich bessere und schnellere Lösungen als die meine. (aber ich weis, als Schüler ists einem meistens egal, die hauptsache man hat was^^)


----------



## Andi_CH (24. Feb 2011)

Blin4ik hat gesagt.:


> @Andi_CH
> nicht die 1 wird geteilt sondern die 381



Mein Einwand hat sich von selbst erledigt ;-)

Ich hab die Lösung nicht analysiert, aber sind ja wirklich nur 362880 mögliche Kombinationen und dafür braucht dein PC 4 Minuten? (Zugegeben, ich habe auch bruteforce vorgeschlagen)


----------



## Blin4ik (24. Feb 2011)

Tomate_Salat hat gesagt.:


> wenn du mir sagst, wo du was nicht verstehst, erkläre ich es gerne....allerdings gibt es sicherlich besser, wesentlich bessere und schnellere Lösungen als die meine. (aber ich weis, als Schüler ists einem meistens egal, die hauptsache man hat was^^)



naja bei mir ist es grad relevant ob ich meine ausbildung bekomme oder nicht, ich muss die lösung vorlegen, zwar werd ich mit java nicht dort weiterarbeiten

also 
z.b. die stelle 

```
if(passt(i))
```
für was steht das passt(i)

und der komplette block

```
public static boolean passt(int zahl)
```

bissher hatte ich nur public static void, aber so eine aufteilung mit noch nem static boolean hat ich noch net, vor allem weil ich net weiß was das static eig bedeutet  und dann das mit dem valueOf und substring und oder char 'c'


----------



## Tomate_Salat (24. Feb 2011)

also ich komme auf 864.197.532 Möglichkeiten, die ausprobiert werden
----
@Blin4ik:
Galileo Computing :: Java ist auch eine Insel – 5.3 Statische Methoden und statische Attribute passt ist somit eine Klassenmethode, welche ich bequem über die main aufrufen kann und das [c]if(passt(i))[/c] steht für ebend diese Methode, welche true zurück gibt, wenn die Zahl "passt". Wenn ich das static weg gelassen hätte, hätte mein Methodenaufruf so aussehen müssen:

```
Generator gen = new Generator();
gen.passt(i);
```


----------



## Gonzo17 (24. Feb 2011)

Hab auch eine Lösung, etwas anders, aber dafür sehr schnell. Habs nicht gemessen, aber gefühlt unter einer Sekunde.

Mein Code fängt quasi bei "nichts" (in diesem Fall ein leerer String) an und hängt immer wieder neue Ziffern an. Da ich hier auf Rekursion gesetzt habe, werden so lange Ziffern angehängt, bis der String 9 Zeichen enthält oder die Bedingungen erfüllt sind. Am Ende werden nur die 9-stelligen Strings ausgegeben, da bei mir eben als "Lösung" quasi alle Zahlen von der Länge 1 bis 9 ermittelt werden, die diese Eigenschaften haben. 


```
public class Test {
	public static void main(String[] args) {
		findMatch("");
	}

	private static void findMatch(String number) {
		if (number.length() > 9 || !check(number)) {
			return;
		}
		for (int i = 1; i <= 9; i++) {
			findMatch(number + i);
		}
		if (number.length() == 9)
			System.out.println(number);
	}

	private static boolean check(String number) {
		boolean[] digits = new boolean[] { false, false, false, false, false,
				false, false, false, false };

		for (int i = 1; i <= number.length(); i++) {
			int digit = charToInt(number.charAt(i - 1));
			if (digits[digit - 1]) {
				return false;
			} else {
				digits[digit - 1] = true;
			}

			String sub = number.substring(0, i);
			if (Integer.valueOf(sub) % i != 0)
				return false;
		}
		return true;
	}

	private static int charToInt(char c) {
		return c - '0';
	}
}
```


----------



## Blin4ik (24. Feb 2011)

wooow Gonzo17 danke ist wirklich schneller, aber dafür noch komplizierter für mich

"digits" und "findMatch" sind das nur die variabelnamen ?


----------



## Andi_CH (24. Feb 2011)

Tomate_Salat hat gesagt.:


> also ich komme auf 864.197.532 Möglichkeiten, die ausprobiert werden


Ich sage nur, dass es mit weniger geht.

Es darf keine Ziffer wiederholt werden - richtig?

if (Wenn Ziffern widerholt werden dürfen)
 return;

Das ist einfache Kombinatorik. Zufällig Auswahl ohne Widerholung.

An der ersten Stelle kann ich frei aus 9 Ziffern wählen
-> 9 Möglichkeiten

An der zweiten Stelle kann ich nur noch auch 8 Ziffern wählen, da ja eine weg ist
-> 8 Möglichkeiten -> Total 9*8 = 72

An der der dritten Stelle 7
-> Total 9*8*7=504

Also 9*8*7*6*5*4*3*2*1 = 362880 Möglichkeiten
( Wobei die 1 exrem relevant ist  )


----------



## Tomate_Salat (24. Feb 2011)

Andi_CH hat gesagt.:


> Ich sage nur, dass es mit weniger geht.



Das mein Code nicht Effizient ist, sollte jedem klar sein, mir geht es nur darum, wieviele Zahlen tatsächlich geprüft werden ;-).


----------



## Gonzo17 (24. Feb 2011)

Blin4ik hat gesagt.:


> "digits" und "findMatch" sind das nur die variabelnamen ?



Ja, genau. Ich erklärs mal ein bisschen.

In der 
	
	
	
	





```
findMatch(String)
```
-Methode wird zuerst überprüft ob der String länger als 9 Zeichen ist oder die Bedinungen nicht erfüllt werden. Trifft eine der beiden Aussagen zu, dann ist hier Schluss und es werden keine weiteren Ziffern an den String gehängt und es erfolgt auch keine Ausgabe.
In der for-Schleife ruft sich die Methode selbst auf, allerdings mit einem String, der genau um eine Ziffer länger ist. Hier wird einfach nur jede Ziffer ausprobiert. Das ist das Schöne an der Rekursion: wenn ein Weg fehlschlägt, dann wird der andere Weg weiter verfolgt. Bringt das Anhängen der 4 kein positives Ergebnis, wird es mit der 5 versucht.

Die Methode 
	
	
	
	





```
check(String)
```
 macht eigentlich auch "nur" das, was da im Aufgabentext steht. Zu allererst wird ein Array 
	
	
	
	





```
digits
```
 mit 9 boolean Werten "false" erzeugt. Jede Stelle im Array steht für eine Ziffer und soll sich merken, ob diese Ziffer schon in der Zahl vorkam.
Dann gehts also los mit der for-Schleife. Hier wird zuerst die Ziffer an der aktuellen Stelle gelesen und in 
	
	
	
	





```
digit
```
 gespeichert. Danach wird im Array 
	
	
	
	





```
digits
```
 überprüft, ob diese Ziffer schon benutzt wurde. Ist das der Fall, wird die Methode mit dem Rückgabewert false beendet. Andernfalls wird markiert, dass die Ziffer eben auftrat.
Im letzte Teil der for-Schleife wird lediglich überprüft, ob die "Teilzahl" bis zur aktuellen Stelle durch die aktuelle Stelle teilbar ist. Ist sie das nicht, wird auch hier die Methode mit dem Rückgabewert false beendet.


----------



## Blin4ik (24. Feb 2011)

ah gut danke, ist besser verständlicher geworden

wofür steht das !check(number) ? 

er überpürft ja ob die zahl kleiner als 9 ist oder dieses ungleich check(number)
und springt zurück falls dies der fall ist, aber so kommt er doch 
gar nicht zur for schleife wenn er immer zurück springt oder wie verstehe ich das ?
also warum er das if mehrmals durchläuft frag ich mich auch ohne schleife, die for schleife ist darunter
ist komplett neuland


----------



## Gonzo17 (24. Feb 2011)

check(number) ansich ruft nur die Methode auf und diese liefert einen boolean-Wert zurück. Das ! vor einem boolean-Wert negiert diesen nur, es wird also ein true zu einem false bzw ein false zu einem true. Wieso ich das da mache? Na ich will ja, dass abgebrochen wird, wenn die Bedingungen NICHT zutreffen, sprich wenn false geliefert wird. Damit die Bedingung dann erfüllt ist, muss das eben negiert wird. Kannst du auch gut mit dem sprachlichen "nicht" vergleichen: "Der String ist länger als 9 Zeichen oder die Bedingungen wurden NICHT erfüllt" würde die if-Abfrage bedeuten.

Wieso das if mehrmals abgefragt wird? Das ist eben Rekursion. Wie du siehst wird die Methode findMatch von sich selbst aufgerufen - damit wird natürlich auch die if-Abfrage wieder durchlaufen. Falls du Rekursion noch nicht hattest/verstehst, ist meine Lösung vielleicht auch garnicht passend.


----------



## Andi_CH (24. Feb 2011)

Tomate_Salat hat gesagt.:


> Das mein Code nicht Effizient ist, sollte jedem klar sein, mir geht es nur darum, wieviele Zahlen tatsächlich geprüft werden ;-).



Ah, ok - Diesen Sourcecode sponserte ihnen Intel oder AMD oder Dell oder ... 

Wenn man bedenkt, dass die 5 zwingend an 5. Stelle sein muss -> 40320 Möglichkeiten
An zweiter Stelle dürfen nur gerade Ziffern stehen -> 20160
Welch Potential da noch drin steckt


----------



## Tomate_Salat (24. Feb 2011)

du machst mich fertig, ehrlich^^


----------



## Andi_CH (24. Feb 2011)

... Donnerstag abend! Ich darf das!


----------



## Tomate_Salat (24. Feb 2011)

dass mir meine Signatur mal so in den Rücken fallen würde, hätte ich nie gedacht :-/ alles klar, ich werde mir eine neue zulegen ;(


----------



## Dow Jones (25. Feb 2011)

Andi_CH hat gesagt.:


> Wenn man bedenkt, dass die 5 zwingend an 5. Stelle sein muss -> 40320 Möglichkeiten
> An zweiter Stelle dürfen nur gerade Ziffern stehen -> 20160
> Welch Potential da noch drin steckt


Das Potential ist wirklich interessant! 
Deine zweite Rechnung ist nämlich nicht ganz richtig: Es gibt - abgesehen von der Ziffer 5 - nur noch vier weitere ungerade Ziffern (1, 3, 7, 9). Dazu kommen vier gerade Ziffern (2, 4, 6, 8). Die daraus resultierende Anzahl der Möglichkeiten ist daher nur noch: 4 * 4 * 3 * 3 * 1 * 2 * 2 * 1 * 1 = 576

Wenn man nun weiter grübelt kann man die Aufgabe vielleicht sogar "per Hand" lösen. Lass mal sehen... Schreiben wir die gesuchte Zahl mal als abcdefghi, wobei jeder Buchstabe für eine eigene Ziffer steht und nehmen wir uns die einzelnen Stellen vor:

*Die vierte Stelle (d):*
Die Zahl abcd soll durch vier teilbar sein. Wir können die Zahl auch schreiben als
a*1000 + b*100 + c*10 + d
Da die ersten beiden Terme ohnehin durch vier teilbar sind brauchen wir sie nicht weiter zu beachten. Bleibt die Bedingung, das c*10 + d durch vier teilbar ist. Für jede ungerade Ziffer c gilt: c*10 mod 4 = 2. Ziffer d muß diesen Rest also zu einer durch vier Teilbaren Zahl "ergänzen", und das schaffen nur die Ziffern 2 und 6. Ziffer d muß also entweder 2 oder 6 sein.

*Die achte Stelle (h):*
Die Zahl abcdefgh soll durch acht teilbar sein. Wir schreiben sie wieder als
a*10.000.000 + b*1.000.000 + c*100.000 + d*10.000 + e*1.000 + f*100 + g*10 + h*1
Die ersten 5 Terme lassen sich sowieso durch 8 teilen, also kommt es auf die gar nicht an. Bleibt noch die Rechnung f*100 + g*10 + h*1. Da f eine gerade Ziffer ist muß f*100 ein Vielfaches von 200 sein - und ist somit auf jeden Fall ebenfalls durch 8 teilbar. Bleibt g*10 + h*1. Äquivalent zu dem oben gesagten bleibt bei der Rechnung "ungeradeZiffer * 10 mod 8" ein Rest von 2 oder 6 übrig. Die Ziffer h muß diesen Rest also zu einer durch 8 teilbaren Zahl ergänzen, und auch hier kommen nur 2 und 6 in Frage.

*Zwischenstand:*
d muß 2 oder 6 sein, h ebenfalls. dadurch bleiben für b und f nur noch die Ziffern 4 und 8 übrig. Somit haben wir die Anzahl der Möglichkeiten für die gesuchte Zahl abcdefghi weiter reduziert: 
4 * 2 * 3 * 2 * 1 * 1 * 2 * 1 * 1 = 96

*Die sechste Stelle*
a*100.000 + b*10.000 + c*1.000 + d*100 + e*10 + f*1 soll durch sechs teilbar sein. Dazu muß sie sowohl durch 2 als auch durch 3 teilbar sein. Durch 2 ist sie ohnehin teilbar, da f eine gerade Ziffer ist. Also müssen wir nur noch die Teilbarkeit durch 3 gewährleisten.
Durch Umformen erhalten wir:
(a*100 + b*10 + c*1)*1000 + d*100 + e*10 + f*1
(abc)*1000 + d*100 + e*10 + f*1
Von der Zahl abc wissen wir, das sie durch drei teilbar sein muß. Bleiben noch die restlichen drei Terme: d*100 + e*10 + f*1 Muß durch 3 teilbar sein. Wir wissen schon, das e=5 ist, d=2 oder d=6 sein muß, und dementsprechend f=4 oder f=8 gilt. Da von den vier möglichen Zahlen nur 258 und 654 durch drei teilbar sind wissen wir nun, das f direkt von d abhängt (und natürlich auch die "Komplemente" h und b). Wenn wir für eine der Variablen b, d, f und h eine Ziffer wählen legen wir dadurch automatisch auch die anderen 3 Ziffern fest.

*Zwischenstand*
a, c, g, i = 1, 3, 7, 9
b = 4  =>  d = 2, f = 8, h = 6
b = 8  =>  d = 6, f = 4, h = 2 
e = 5
Anzahl der Möglichkeiten: 4 * 2 * 3 * 1 * 1 * 1 * 2 * 1 * 1 = 32

*Die dritte Stelle*
Es muss gelten: a*100 + b*10 + c*1 ist durch drei teilbar. Wenn a und c durch drei teilbar wären (also 3 und 9 sind), dann müsste b ebenfalls durch drei teilbar sein um die Bedingung zu erfüllen. Da das freilich nicht geht wissen wir schonmal das wir nur entweder 3 oder 9 oder keine der beiden Ziffern verwenden dürfen, aber keinesfalls beide gleichzeitig. Ich greife jetzt mal vor und behaupte: wir benötigen hier genau einer der beiden Ziffern (siehe Begründung zur neunten Stelle).
Wir wissen nun, das a entweder 3 oder 9 sein muß, und c dementsprechend 1 oder 7. Mehr können wir an dieser Stelle nicht über die ungeraden Ziffern aussagen, denn 3 und 9, bzw 1 und 7 liegen bezüglich der Modulo 3 Rechnung in der gleichen Restklasse. Anhand des Quersummentests für die durch-drei-Teilbarkeit kann man weiterhin leicht sehen, das es iim Augenblick egal ist an welcher Stelle die Ziffern stehen (also ob a=3 oder c=3 ist).
Das macht die Entscheidung ob b nun 4 oder 8 ist aber umso leichter: 143 lässt sich nicht durch 3 teilen. Demnach muss b = 8 sein, und dadurch haben wir schonmal alle geraden Ziffern fest verteilt. 

*Die neunte Stelle*
Wir beginnen wieder mit unserer üblichen Schreibweise:
a*100.000.000 + b*10.000.000 + c*1.000.000 + d*100.000 + e*10.000 + f*1.000 + g*100 + h*10 + i soll durch 9 teilbar sein. Durch umformen erhalten wir:
abc*1.000.000 + def*1.000 + g*100 + h*10 + i*1
Wir haben bei der sechsten Stelle bereits gesehen, das sowohl die Zahl abc (und somit auch alle Vielfache davon) als auch die Zahl def Vielfache von drei sind. Damit auch die Zahl ghi ein Vielfaches von drei ist (denn das ist ja Voraussetzung um überhaupt durch 9 teilbar sein zu können) gilt hier, analog zur dritten Stelle, das wir nicht gleichzeitig die Ziffern 3 und 9 verwenden können. Daraus folgt, das wir in abc und ghi jeweils genau eine der beiden Ziffern verwenden müssen. Soweit zur Begründung der obigen These.
Naja, und jetzt bin ich mit meinem Latein auch am Ende. ;(

Immerhin haben wir die Anzahl der möglichen Zahlen auf 16 heruntergebrochen:
183654728
183654927
381654729
381654927
387654129
387654921
783654129
783654921
189654327
189654723
981654327
981654723
789654123
789654321
987654123
987654321

Hat jemand eine Idee was man über die siebte Stelle aussagen kann?


----------



## Blakh (3. Mrz 2011)

Hilft das: Neunstellige Zahl und Teilbarkeit ?


----------

