tænk binært. 1 ^3 = 1 // 10 ^3 = 1000 // jo større tal, jo tættere på 11 ^3 = 11011 // "3 gange så mange binære cifre" 100^3 = 1000000 // 111^3 =101010111
det bruger du ti at få et godt første gæt
(x+1)*(x+1)*(x+1) = x^3 +3x^2 +3x + 1
den formel bruger du til at 'justere tallet list' indtil det er korrekt.
public class Main { public static int qroot(int n) { double q_root = Math.pow(n, 0.3333333d); return (int)q_root; }
public static void main(String[] args) { for(int i=1;i<=20;i++) { int temp = i * i * i; System.out.println("Kubikroden af " + temp + "\t" + qroot(temp)); } } }
Output: Kubikroden af 1 1 Kubikroden af 8 1 Kubikroden af 27 2 Kubikroden af 64 3 Kubikroden af 125 4 Kubikroden af 216 5 Kubikroden af 343 6 Kubikroden af 512 7 Kubikroden af 729 8 Kubikroden af 1000 9 Kubikroden af 1331 10 Kubikroden af 1728 11 Kubikroden af 2197 12 Kubikroden af 2744 13 Kubikroden af 3375 14 Kubikroden af 4096 15 Kubikroden af 4913 16 Kubikroden af 5832 17 Kubikroden af 6859 18 Kubikroden af 8000 19
soreno > Metoden virker vist ikke helt korrekt. hvis n=28 retunerer den 4, men det mest korrekte er vel 3. Desuden skal jeg være sikker på at invarianten er overholdt: r^3 <= n < (r+1)^3
Det giver følgende output: Kubikroden af 1 1 Kubikroden af 8 2 Kubikroden af 27 3 Kubikroden af 64 3 Kubikroden af 125 5 Kubikroden af 216 6 Kubikroden af 343 6 Kubikroden af 512 7 Kubikroden af 729 8 Kubikroden af 1000 9 Kubikroden af 1331 10 Kubikroden af 1728 11 Kubikroden af 2197 12 Kubikroden af 2744 13 Kubikroden af 3375 14 Kubikroden af 4096 15 Kubikroden af 4913 16 Kubikroden af 5832 17 Kubikroden af 6859 18 Kubikroden af 8000 19
går det galt 2 steder division med 0 i første linie i din while og if (guess <= 0) guess = 1; // forhindrer at den kan komme til at overholde din invariant
Jeg kan næsten forstå på dit spm at du går på datalogi i århus? Hvis det er tilfældet skal du ligge mærke til at du ikke må benytte math klassen, du skal bruge en løkke.
Jeg har følgende metode: public static int CubeRoot2(int n) { int r = n; do { int a = r - ( (r*r*r - n) / (3*r*r)); r = (a != r) ? a : a + (Math.random() > 0.5 ? 1 : -1); if( r > 1290) r = 1290; if(r <= 0) r = 1; } while( (n < r*r*r) || (n >= (r+1)*(r+1)*(r+1)) ); return r; } While-løkken tager ikke højde n=0 men det kan selvfølgelig gøres med en IF og så retunerer 0, ellers ved jeg ikke lige hvordan jeg gør det. Hvad kan jeg erstatte Math-delen med?
Nej - algoritmen bør konvergere og netop muligheden for både +1 og -1 bør mindske muligheden for at den "hænger fast" et forkert sted.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.