Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
bei dieser Aufgabe sollen die Ergebnisse mehrere integer Divisionen aufaddiert werden.
Mein Code dazu funktioniert so weit ganz ok bis auf ein kleines Problem. Bei den Tests kommt teils eine leichte Abweichung vom eigentlichen Ergebnis vor.
Z.B so:
oder so:
Das ist der Code:
Java:
public class HalvingSum {
int halvingSum(int n) {
String len = String.valueOf(n);
double sum = 0;
for(int i=0; i<len.length()*2; i++){
double cal = n/Math.pow(2, i);
sum = sum + cal;
}
return (int) sum;
}
Keine Ahnung, woher diese Abweichungen kommen. Weiß jemand von euch woran es liegt?
Vielen Dank
Mein Code dazu funktioniert so weit ganz ok bis auf ein kleines Problem. Bei den Tests kommt teils eine leichte Abweichung vom eigentlichen Ergebnis vor.
Nein, du hast die Ganzzahl n erneut in eine Ganzzahl umgewandelt, und dann mit der Potenz eine Gleitkomma-Division durchgeführt.. Am besten lässt du dir in der Schleife mal die Variable cal ausgeben, damit du siehst, was da passiert.
Das ist genau so, als würdest du eine beliebige Zahl verwenden, diese muss nur groß genug sein. Du addierst einfach immer 0 wenn die Zahl zu groß wird. Sieh dir #8 noch mal an, da steht schon die Frage: Was hat die Länge des strings mit der Anzahl der durchzuführenden Divisionen zu tun? Die solltest du dir wenigstens selbst beantworten können.
Das ist genau so, als würdest du eine beliebige Zahl verwenden, diese muss nur groß genug sein. Du addierst einfach immer 0 wenn die Zahl zu groß wird. Sieh dir #8 noch mal an, da steht schon die Frage: Was hat die Länge des strings mit der Anzahl der durchzuführenden Divisionen zu tun? Die solltest du dir wenigstens selbst beantworten können.
Die Aufgabe gibt es doch quasi vor: Teile die Zahl solange durch 2 (und addiere die Zwischenergebnisse), bis als Ergebnis der Division 1 herauskommt. Nix String. Nur Zahlen.
Hallo! du könntest so an diese Aufgabe herangehen:
Java:
public class HalvingSum {
public int halvingSum(int n) {
int sum = n;
int i = 2;
while (n / i != 0) {
sum += n / i;
i <<= 1;
}
return sum;
}
public static void main(String[] args) {
HalvingSum s = new HalvingSum();
System.out.println(s.halvingSum(25)); // => 47
}
}
In einem nächsten Schritt könnte dann die while -Schleife in eine for -Schleife transformiert werden. Die einen verwenden lieber for, die anderen lieber while, das ist etwas Jacke wie Hose.
Hallo! du könntest so an diese Aufgabe herangehen:
Java:
public class HalvingSum {
public int halvingSum(int n) {
int sum = n;
int i = 2;
while (n / i != 0) {
sum += n / i;
i <<= 1;
}
return sum;
}
public static void main(String[] args) {
HalvingSum s = new HalvingSum();
System.out.println(s.halvingSum(25)); // => 47
}
}
In einem nächsten Schritt könnte dann die while -Schleife in eine for -Schleife transformiert werden. Die einen verwenden lieber for, die anderen lieber while, das ist etwas Jacke wie Hose.
In diesem Zusammenhang ein kleiner Hinweis: das ist nicht eine rein technische Sache, sondern eine Frage dessen, wie man das Problem sieht.
Der eine sagt: huch, ich sehe Potenzen -> Math.pow
Der andere sagt: hey, da wird wiederholt eine Rechnung ausgeführt und in jedem Schritt der Divisor mit dem konstanten Faktor 2 multipliziert.
Der zweite Sichtweise würde ich hier bevorzugen, weil das Problem eben nicht Potenzen sind. Außerdem kann man die Aussage dahingehend interpretieren, dass im jeweils nächsten Schritt die Hälfte des aktuellen Summanden addiert wird:
Java:
int halvingSum(final int n) {
int sum = 0;
int summand = n;
while (summand != 0) {
sum += summand;
summand /= 2;
}
return sum;
}