Suma składników, silnia.

0

Mam napisać program który podaje sumę składników x^n/n!
Z tym, że x wprowadza użytkownik, a n zmienia się od 0 do wartości przy której przyrost sumy jest mniejszy od zadanej przez użytkownika dokładności.

Niestety próbuję na różne sposoby a program nie działa.

 import java.util.Scanner;
 import java.util.*;
 import javax.swing.*;
 
 public class MetodyZadanie4b {

		
	public double suma(double x, double dokladnosc){
		double n=0;
		double suma=0;
		double potega;
		
			do{
		potega = (double)Math.pow(x, n);		
		
		double s=1;
		for(int i=1;i<=n;i++) s*=i;
	
		suma=suma+(potega/s);
		n=n+1;
 	    }
 	    
 	  	   while(suma<dokladnosc);
 	  	   return suma;
	}
}
	
import java.util.Scanner;
import javax.swing.JOptionPane;
 

 class Main{
 	public static void main(String[]args){
     
     double n;
     String liczba1;
     int Powtarzanie;
         	
 	MetodyZadanie4b metody = new MetodyZadanie4b();
 			
	do{
 				
 	 liczba1 = JOptionPane.showInputDialog(null, "Podaj pierwsza liczbe:");
 	 
 	 double x = Double.parseDouble(liczba1);
 	 String liczba2 = JOptionPane.showInputDialog(null, "Podaj dokladnosc:");
	 double dokladnosc = Double.parseDouble(liczba2);


	JOptionPane.showMessageDialog(null, "Suma skladnikow (x^n)/n! = " + metody.suma(x, dokladnosc) + "\n");
    Powtarzanie = JOptionPane.showConfirmDialog(null, "Kontynuowac?", "Pytanie", JOptionPane.YES_NO_OPTION);
    
    }
	while (Powtarzanie == JOptionPane.YES_OPTION); ; 

 		System.exit(0); 
 } 
}
 			

Mógłby ktoś wyjaśnić co robię źle i co mogę poprawić? A może to zadanie powinno się wykonać inaczej, jednak żaden sposób mi się nie udał i nie wiem w czym tkwi problem.
Z góry dziękuję za pomoc.

0

Na pewno błędny jest ten warunek:

while(suma<dokladnosc);

Pętla ma się wykonywać dopóki przyrost sumy jest większy od dokładności.

0

Aj, faktycznie. Poprawione.
Ale mimo to wynik zawsze jest ten sam. I nie wiem co to powoduje.

W razie czego: w zadaniu na końcu podane jest że program umożliwia testowanie dla różnych podawanych x i dla każdego x przy różnych podanych dokładnościach.

0
    public double suma(double x, double dokladnosc){
        int n = 1;
        double suma = 0;
        double skladnik = 1.0;
        while(skladnik>=dokladnosc)
        {
            suma+=skladnik;
            skladnik = skladnik*x/n;
            n++;
        }    
        return suma;
    }

Twój kod był bardzo niewydajny, obliczając np. \frac{x<sup>{12}}{12!} nie korzystałeś z tego, że już masz obliczone x</sup>{11} i 11!.

0

Więc mam zmienić moją metodę suma na tą co Ty podałeś?
Ale gdzie wtedy liczona jest potęga i silnia?

0

Tu

skladnik = skladnik*x/n;

. Zastanowiłeś się nad moja uwagą o niewydajnym kodzie? Zauważ też, że Ty nie potrzebujesz potęgi i silni, Ty potrzebujesz tylko ich iloraz.

0

Tak, fakt, wcześniej za każdym razem od nowa liczyła się silnia i potęga, więc nie ma sensu dawać już kodu.

potega = (double)Math.pow(x, n);        
 
        double s=1;
        for(int i=1;i<=n;i++) s*=i;
 
        suma=suma+(potega/s); 

?

Mimo to, po zmianie program dalej nie działa i wciąż podaje ten sam wynik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1