Prosty program

WO
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:49
0

Mam do napisania program taki jak w załączniku. Jednak nie mam pojęcia jak ten szereg przedstawić. Mój aktualny kod to:

Kopiuj
 double suma(double x,int n)
{ 
int i;

if(fabs(x)<1 && n<100){
for(i=0;i<n;i++){

}

}else return 0;

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
1
  1. zapoznaj się z inkrementacją: http://4programmers.net/Forum/1101404
  2. int n oraz int i - spodziewasz się ujemnych numerów szeregu?
  3. oblicz czemu się równa szereg(i+1)/szereg(i), zakładając że x - szereg(0)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
0

Zapewne masz problem jak wyliczyć n-ty wyraz tego ciągu. Pominiemy 'x' i kwestie znaku w naszych rozwiązaniach. Zauważ, że n-ty wyraz tego ciągu składa się z 2n - 1 elementów. Licznik ma zawsze o 1 element mniej od mianownika. Zauważ też, że licznik to iloczyn kolejnych nieparzystych cyfr, a mianownik to iloczyn cyfr parzystych, z wyjątkiem ostatniej. Więc n-ty element element możesz wyrazić jako (iloczyn liczb nieparzystych / iloczyn liczb parzystych) / liczbę nieparzystą. Ta liczba nieparzysta, to kolejna liczba z szeregu liczb, które znajdują się w liczniku.

A o to część rozwiązania:

Kopiuj
double n_element(int number){
  int nominator = 1;
  int denominator = 1;
  int multiplier = 1;

  for(multiplier = 1; multiplier < (2 * number - 1); ++multiplier){
    if((multiplier % 2) - 1 == 0)
      nominator *= multiplier;
    else
      denominator *= multiplier;
  }
  if(number % 2 == 0)
    return -(double)nominator / (double)(denominator * multiplier);
  else
    return (double)nominator / (double)(denominator * multiplier);
} 
_13th_Dragon
Kompletny bezsens, element nr 1000000 ile czasu będziesz liczyć? Obliczenie całego szeregu ze złożoności O(n) zrobiłeś O(n^2)
Sparrow-hawk
Ale to nie było zadanie na konkurs algorytmów. OK - nie jest optymalne, ale myślę, że może naprowadzić bardziej autora postu na rozwiązanie problemu, niż twoja odpowiedź, bo ja tu nie widzę ciągu geometrycznego.
_13th_Dragon
A kto powiedział że ma być ciąg geometryczny? Wystarczy że znajdziemy takie f(i,x) że: szereg(i+1) == f(i,x) * szereg(i) ciąg geometryczny to kiedy f(i,x) == C, czyli jest stałą. Co do zrozumienia problemu - to twój post utrudnia zrozumienie.
Sparrow-hawk
Masz rację, od złej strony szukałem rozwiązania.
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
0

W takim razie czy tak:

Kopiuj
double n_element(double x, int number){
  double value = 0.0;

  if(fabs(x) < 1 && number < 100){
    if(number == 0)
      value = 1.0;
    else{
      value = x;
      do{
        value *= -(pow(2.0 * number - 1.0, 2.0) / (2.0 * number * (2.0 * number + 1.0))) * x * x;
      }while(--number > 0);
    }
  }
  return value;
}

będzie poprawnie?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
0

Na to samo ci wychodzi, jeżeli masz funkcje n_element to już jest źle.
Każdy kolejny element wyliczaj na podstawie poprzedniego.
I od razu ich sumuj.
int number - czyżby spodziewałeś się ujemnych numerów?
if(fabs(x) < 1 && number < 100) - to sprawdzaj na zewnątrz funkcji.
pow(2.0 * number - 1.0, 2.0) - nie używaj pow do potęg całkowitych tym bardziej 2 lub 3, wydaje mi się że masz problem z kolejnością operacji w matematyce.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
0

I po raz kolejny:

Kopiuj
double n_sum(double x, unsigned int count){
  double sum = 0.0;

  if(fabs(x) < 1 && count < 100){
    sum = 1.0;
    if(count > 0){
      double value = x;
      unsigned int number = 1;
      do{
        value *= -((2.0 * number - 1.0) * (2.0 * number - 1.0) / (2.0 * number * (2.0 * number + 1.0))) * x * x;
        sum += value;
      }while(count > number++);
    }
  }
  return sum;
}

A miało być proste.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
0

Sprawdź co ci zwraca dla count = 0, count = 1 i count = 2 i policz to w excelu lub openoffice


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
WO
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:49
0
Kopiuj
double suma(double x,int n)
{
int i;

if(fabs(x)<1 &&(n>0&& n<100)){
   double sum,wyr;
        sum=x;
wyr=x;
for(i=1;i<n;++i){
wyr*=-(2*i-1)*(2*i-1)*x*x/((2*i+1)*2*i);
sum+=wyr;
}
return sum;
}else return 0;

}

Czy ten kod jest poprawny, czy użyłem tu jakiś zbędnych rzeczy?

kq
Na pewno nie ma zbędnych indentacji. Polecam http://format.krzaq.cc jak sam nie umiesz formatować kodu.
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
1

To straszne! http://ideone.com/81hHxF

Kopiuj
#include <stdio.h>
#include <math.h>

double suma(double x,unsigned n)
  {
   if((fabs(x)>=1)||(n<1)) return 0;
   double item=x,sum=item;
   for(unsigned i=2,p=1;i<=n;++i,p+=2,sum+=item) item*=-x*x*p*p/((p+1)*(p+2));
   return sum;
  }

int main(void)
  {
   for(unsigned n=0;n<=4;++n) printf("%u %.12lf\n",n,suma(0.1,n));
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
WO
Czemu wyświetlają ci się wartości powyżej 1, jak nie mogą być.
_13th_Dragon
bo minusa zapomniałem

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.