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:
publicclassHalvingSum{inthalvingSum(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:
publicclassHalvingSum{publicinthalvingSum(int n){int sum = n;int i =2;while(n / i !=0){
sum += n / i;
i <<=1;}return sum;}publicstaticvoidmain(String[] args){HalvingSum s =newHalvingSum();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:
publicclassHalvingSum{publicinthalvingSum(int n){int sum = n;int i =2;while(n / i !=0){
sum += n / i;
i <<=1;}return sum;}publicstaticvoidmain(String[] args){HalvingSum s =newHalvingSum();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:
inthalvingSum(finalint n){int sum =0;int summand = n;while(summand !=0){
sum += summand;
summand /=2;}return sum;}