VicariousVirus
Anmeldungsdatum: 7. Mai 2011
Beiträge: 27
Wohnort: Berlin
|
Hey,
ich hab mal wieder eine Frage:
Ichb will zwei Arrays auf die Relation vergleichen, ob a kleiner ist. Dabei ist der Array in der Größenordnung, als wäre er ein BigInteger (die Aufgabe ist in etwa die Methoden zu schreiben, als wenn es keine API BigInt geben würde).
Für den Fall das eines Stellenmäßig größer ist hab ich schon eine Lösung. Für den Fall, dass beide Array gleich lang sind wollte ich wie folgt vorgehen:
1
2
3
4
5
6
7
8
9
10
11
12 | ....
else {
for(int i =a.length-1;i>=0;i--){
if(a[i] < b[i] && a[i] != 0 && b[i] != 0){
lessRelation = true;
break;
}
else{
lessRelation = false;
}
}
....
|
Der spannende Teil ist im if-Bereich, ich wollte schauen, ob die Elemente von a[i] kleiner sind als b[i] sind. Allerdings kann der Array auch Nullen haben, was mich gerade verwirrt. Die müssten aber ignoriert werden.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Was genau ist jetzt die Frage? Kommst du mit auftretenden Nullen nicht klar, oder worin besteht dein konkretes Problem?
|
VicariousVirus
(Themenstarter)
Anmeldungsdatum: 7. Mai 2011
Beiträge: 27
Wohnort: Berlin
|
Ich weiß nicht, wie ich die Nullen im beim if sozusagen ignorieren soll. Also das an den Stellen wo a[i] und b[i] null ist soll er nicht abbrechen, da die beiden gleich groß wären, die sollen einfach nicht beachten werden.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
VicariousVirus schrieb: Ich weiß nicht, wie ich die Nullen im beim if sozusagen ignorieren soll. Also das an den Stellen wo a[i] und b[i] null ist soll er nicht abbrechen, da die beiden gleich groß wären, die sollen einfach nicht beachten werden.
Redest Du speziell von führenden Nullen? Es macht doch keinen Unterschied ob ich
2662 vs 2752 vergleiche oder
0660 vs 0750
|
VicariousVirus
(Themenstarter)
Anmeldungsdatum: 7. Mai 2011
Beiträge: 27
Wohnort: Berlin
|
Nein keine führenden Nullen, die sind schon elimeniert worden.
Es geht nur noch darum, wenn der Array die gleiche Länge hat, wollte ich schrittweise durchgehen und von der höchsten Stelle schauen, ob a kleiner als b ist.
Deswegen auch der for Teil mit dem if, wenn dann aber an einer Stelle a und b = 0 sind müsste die ja übersprungen werden. Falls a größer b ist soll false zurückgeliefert werden und die for-Schleife abgebrochen werden.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
Und wenn a und b == 2 sind? Was ist der Unterschied zu 0?
|
pascoli
Anmeldungsdatum: 5. Mai 2008
Beiträge: 124
|
Wie wär's mit
| if ( a[i] == 0 && b[i] == 0 )
continue;
|
als erste Anweisung im for-Block.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
pascoli schrieb: Wie wär's mit
| if ( a[i] == 0 && b[i] == 0 )
continue;
|
als erste Anweisung im for-Block.
Kannst Du erklären was am Fall ((a == b) == c) besonders ist für den Fall das c := 0?
|
pascoli
Anmeldungsdatum: 5. Mai 2008
Beiträge: 124
|
Nun, es sollte nur Null ignoriert werden, nicht aber a == b und a != 0. Ich weiß ja nicht, was da sonst noch an Code im else-Zweig "weggekürzt" wurde.
:= Pascal läßt grüßen ☺
|
VicariousVirus
(Themenstarter)
Anmeldungsdatum: 7. Mai 2011
Beiträge: 27
Wohnort: Berlin
|
Naja, für den Fall, dass a == b sein sollte ist die Relation doch schon eindeutig, dann ist a nicht kleiner b.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | static boolean less (int[ ] a, int[ ] b)
{
boolean lessRelation = false;
if(a.length != b.length){
if(a.length >= b.length)
lessRelation = false;
else
lessRelation = true;
}
else {
for(int i =a.length-1;i>=0;i--){
if(a[i] >= b[i]){
lessRelation = false;
break;
}
else{
lessRelation = true;
}
}
}
return lessRelation;
}
|
So sieht die Methode momentan aus.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Aus dem a.length >= b.length kannst du übrigens problemlos ein a.length > b.length machen. Einerseits ist dann klarer, was du möchtest. Und andererseits wurde durch das vorherige Testen auf a.length != b.length ja bereits die Gleichheit ausgeschlossen. Das wird der Compiler sicherlich schon von sich aus wegoptimieren und es hat so oder so keine ernsten Auswirkungen auf die Laufzeit, aber darum geht es hier IMHO auch nicht.
|
pascoli
Anmeldungsdatum: 5. Mai 2008
Beiträge: 124
|
Ist das Problem jetzt gelöst? Beim ersten a[i] == b[i] wird lessRelation == false und die Schleife beendet. Wird in der Schleife auf a[i] > b[i] getestet und gilt für alle i a[i] == b[i] ist am Ende lessRelation == true. Soll das alles so sein?
|
elostio
Anmeldungsdatum: 2. Februar 2006
Beiträge: 424
Wohnort: Guayaquil
|
so würds ich schreiben: | static boolean less (int[ ] a, int[ ] b) {
if(a.length != b.length){
return (a.length < b.length);
}
for(int i =a.length-1;i>=0;i--) {
if (a[i] != b[i]) { return a[i] < b[i]; }
}
return false; // a == b
}
|
edit: was noch interessant ist, wo sind denn im Array die höchsten Stellen zu finden? Im Moment gehen wir von "rechts" aus.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13207
|
elostio schrieb:
edit: was noch interessant ist, wo sind denn im Array die höchsten Stellen zu finden? Im Moment gehen wir von "rechts" aus.
Wo ist bei Dir "rechts"? Eine Angabe welchen Index Du meinst, wäre weniger fehlerträchtig. 😉 Ja, es wäre schon wichtig zu wissen, wie die Eingabedaten aussehen und wie das Ergebnis aussehen soll. Im Übrigen kann man nicht die Länge nehmen, denn man weiß nicht, ob die führenden Stellen Nullen enthalten oder nicht. Falls das nicht als Eingabe zugelassen ist, würde ich das auf jeden Fall prüfen und andernfalls eine Exception werfen. Ciao robert
|
elostio
Anmeldungsdatum: 2. Februar 2006
Beiträge: 424
Wohnort: Guayaquil
|
rklm schrieb: Wo ist bei Dir "rechts"? Eine Angabe welchen Index Du meinst, wäre weniger fehlerträchtig. 😉
Ja hast natürlich recht, ich wollte die Bezeichung Big bzw. Little Endian verwenden, dachte aber so wäre es einfacher. ☺ rklm schrieb: Im Übrigen kann man nicht die Länge nehmen, denn man weiß nicht, ob die führenden Stellen Nullen enthalten oder nicht. Falls das nicht als Eingabe zugelassen ist, würde ich das auf jeden Fall prüfen und andernfalls eine Exception werfen.
VicariousVirus schrieb: Nein keine führenden Nullen, die sind schon elimeniert worden.
|