serie chingona

Iniciado por Erius, 24 Mayo 2018, 07:54 AM

0 Miembros y 1 Visitante están viendo este tema.

Erius

Buenas a todo el foro y al que vea este asunto.
Quisiera que alguien me pueda ayudar o guiar en esta serie que les presentare a continuación.
El numerador tomara como limite de la serie.
Supongamos que le pido un numero de limite a un usuario, este introduce el numero "6". Entonces la serie tiene que ir de esta forma:


S = 1/1 + 1/3 + 1/5  - 2/7 - 2/9  + 3/11 + 3/11 + 3/9 - 4/7 - 4/5 + 5/3 + 5/1


Como se puede observar, los 3 primeros números tienen que sumar, los dos siguientes se empiezan a restar, luego nuevamente se suman 3 números, se restan 2 números y así sucesivamente.
Hay que tener cuenta que el denominador va aumentando de 2 en 2 hasta un cierto punto y que luego se va reduciendo.
En el numerador, los 3 primeros dígitos son el numero " 1 " , luego "2", luego "3", e ira así sucesivamente hasta el limite introducido.


La verdad solo pude llegar hasta la mitad del problema, "3/11" donde ambos números tienen que ser iguales y luego reducirse.
Cualquier ayuda es buena.


Solo pude llegar hasta aquí, si hay errores, tan solo díganlo.
Gracias de Anticipo...




Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
int numero, deno = 1,posi = 0, ban = 1, nega = 0;
float serie1 = 0, serie2 = 0, serieT = 0, T;

cout << "Introduzca un numero: ";
cin >> numero;
cout << endl;
for(int i = 1; i <= numero / 3; i++){
if(ban == 1){
while(posi < 3){
cout << " + " << i << "/" << deno << " ";
T = T + i / deno;
serie1 += T;
posi += 1;
deno += 2;
}
posi = 0;
ban = 0;
}
else{
while(nega < 2){
cout << " - " << i << "/" << deno << " ";
T = T - i / deno;
serie2 += T;
nega += 1;
deno += 2;
}
nega = 0;
ban = 1;
}
serieT = serie1 + serie2;
}

return 0;
}



· Los códigos deben ir en etiquetas GeSHi
· No se debe escribir en mayúsculas
>aquí las reglas del foro
-Engel Lex

Serapis

#1
Pero tu mismo te has respondido en parte...

Citar
Como se puede observar, los 3 primeros números tienen que sumar, los dos siguientes se empiezan a restar, luego nuevamente se suman 3 números, se restan 2 números y así sucesivamente.
Hay que tener cuenta que el denominador va aumentando de 2 en 2 hasta un cierto punto y que luego se va reduciendo.
En el numerador, los 3 primeros dígitos son el numero " 1 " , luego "2", luego "3", e ira así sucesivamente hasta el limite introducido.

Tienes  4 series... la del numerador, la del denominador, la del signo de operacion, y la de cambio del numerador.
Además se pueden simplificar ya que parece que el cambio de signo coinciden con el cambio del valor del numerador.
1, 1, 1, 2, 2,
+, +, +, -, -,

Una de las series es 3,2, 3,2, 3,2, 3,2... Si simplemente alterna entre dos valores, puedes poner sendos bucles uno tras otro limitados por dichos valores.


   bucle para A desde 1 a 3
       ...
   siguiente

   bucle para B desde 1 a 2
       ...  
   siguiente


Luego el numerador se mantiene con su valor en el bucle A, pero al salir aumenta en uno y se mantiene así en el bucle B, al salir aumenta... Además se ha constatado que el signo sigue 'el ritmo' del numerador, luego en el bucle A suma y en el bucle B resta
y ahora con todo esto actualizamos el código:


entero valor = Pedir numero ¿positivo?

entero numerador = 1
entero acumulador = 0
entero denominador = 1

   bucle para A desde 1 a 3
       acumulador  = acumulador + (numerador / x) //x porque aún no hemos determinado el valor del denominador.
   siguiente
   numerador +=1

   bucle para B desde 1 a 2
       acumulador  = acumulador - (numerador / x)
   siguiente
   numerador +=1



Ahora estudiemos el denominador... dices que empieza en 1 hasta alcanzar un tope. entiendo que el tope será aquel que luego le permita descender nuevamente hasta acabar en 1. Saber ese tope exige conocer cuantos quebrados compondrán la serie.
Entonces empezaremos por calcularlo, después de todo, necesitábamos saber esto aunque no se pidiera...cuando acaba la serie.
Veamos... el denominador aumenta 2 cada vez, empieza en 1 debe acabar en 1, en tanto que el numerador se repite 3 veces y luego dos antes de cambiar, es decir
El numerador necesita 5 quebrados para aumentar en 2 su valor. Luego podemos sumar 5 quebrados por cada 2 valores que se resten al tota...
numquebrados = ((Total -1) /2) * 5
Ahora bien, esa división de 2, implica que si total-1 no es par, dará decimales... miremos dos casos de ejemplo uno par y otro impar para ver como se comporta:
v = 7
v= 8
con v = 7 (mirando sólo el numerador) 111,22,,333,44,,555,66 = 15 quebrados
con v = 8 (mirando sólo el numerador) 111,22,,333,44,,555,66,,777 = 18 quebrados.
Es decir, la conclusión es clara, tal como se preveía... si v es impar (o v-1 es par), la fórmula se cumple (7-1)= 6; 6/2= 3; 3*5 = 15 justo lo que nos da...
en cambio si v= par, con la fórmula nos da: 8-1= 7; 7/2= 3'5; 3'5*5 = 17'5
Cono resulta exactamente, consideremos no restarle 1, para que sea para y la división sea entera: 8/2= 4; 4*5= 20, luego excede en 2... pues ya esta, cuando sea par seguimos esta otra formula:
quebrados = (((v/2) * 5) -2)

Todavía podría reqerir un ajuste a casua de denominador, pero éste requiere saber de antemano el número teórico de quebrados, luego primero calculamos el número teórico, y luego se actualizaría. Sin embargo debido a una ambigüedad, sin aclarar, no se lleva a cabo tal ajuste...

entero quebrados
   si ((v and 1) = 0 ) luego  // 'plis': v and 1, no: v modulo 2
       quebrados = (((v/2) * 5) -2)
   sino
       quebrados = (((v-1) /2) * 5)
   fin si


Una vez conocido la cantidad de quebrados, ahora ya podremos conocer el valor máximo del denominador:, pués llegará justo a la mitad de los quebrados.
demoninadorMax = (1 + (((quebrados-2)/2) *2)) ... lo abreviaremos a dMax...
+1, porque el denominador comienza en 1, quebrados -2, porque los dos quebrados de los extremos ya se consideran, entre 2, porque la serie crece, y luego decrece y por 2 porque el siguiente denomindador el el previo aumentado en 2.

Veamos si resulta acertado, para los valores ya conocidos (6, 7 y 8)
dMax(x) viene a decir valor máximo del denominador cuando el valor introducido sea x.
dMax(6) = (1 + (((12-2)/2*2)) = 11 (coincide con lo que pusiste)
dMax(7) = (1 + (((15-2)/2)*2) = 14
dMax(8) = (1 + (((18-2)/2)*2) = 17
Antes de comprobar si los últimos coinciden, queda claro que se puede, simplificar ya que /2*2 se anulan mutuamente. dividir algo entre 2 para luego inmediatamente multiplicalro por dos, es lo mismo que no hacer nada. Luego simplificado quedaría:
dMax = (1 + quebrados-2) , y como ahora son sumas, también se pueden simplificar...
dMax = (quebrados -1)
A hora la comprobación para v=7 y v=8 (con v=6, es 11, como ya colocaste en el enunciado).
La comprobación la hacemos colocando los numeradores y debajo la línea resultante denominadores (se antecede con 0, para que todos tengan dos cifras y visualmente coincidan las líneas).
para v = 7;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 (15 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 13 11 ,,, 09 07 05 , 03 01

para v = 8;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 ,,, 07 07 07 (18 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 17 17 ,,, 15 13 11 , 09 07 ,,, 05 03 01

Vemos que en realidad, a causa de valores pares o impares no se ajusta con la formulación... realmente no es complicado ajustarla, pero como decía más arriba hay una ambigüedad en tu especificación, luego no lo toco y resumo que como este resultado ofrece básicamente la misma cantidad de quebrados que los que nos daban pero sujeto también al condicionante de si v es par o impar, podemos simplificar que:
Si v = par; dMax = quebrados  (el máximo se repite 2 veces);
y Si v=impar; dMax= (quebrados-1) (no se repite) que es exactamente la misma conclusión a la que llegamos.

Entonces volvemos al código previo para completarlo:

entero quebrados, dMax
   si ((v and 1) = 0 ) luego  // v es par
       quebrados = (((v/2) * 5) -2)
       dMax = quebrados       // denominador central se repite.
   sino                               // v es impar
       quebrados = (((v-1) /2) * 5)
       dMax = (quebrados -1)  // denominador central no se repite.
   fin si


Y finalmente si montamos todo el código junto, con la lógica que une todas las partes...

entero valor = Pedir numero ¿positivo?
entero resultado

resultado = CalcularCustomSerie(valor)


entero = funcion CalcularCustomSerie(entero valor)
   entero numerador = 1
   entero acumulador = 0
   entero denominador = 1
   entero inc = 2
   entero quebrados, dMax, q //q lleva la cuenta de los quebrados.
   buleano vPar


   // calcular número de quebrados y valor máximo del denominador.
   vPar = ((valor and 1) = 0)      // 'plis': v and 1, no: v modulo 2    
   si (vPar = TRUE ) luego  
       quebrados = (((valor / 2) * 5) -2)
       dMax = quebrados            // denominador central se repite.
   sino // vPar = FALSE
       quebrados = (((valor -1) / 2) * 5)
       dMax = (quebrados -1)      // denominador central no se repite.
   fin si

   Hacer
       bucle para A desde 1 a 3
           acumulador  = acumulador + (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
           
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

       bucle para B desde 1 a 2
           acumulador  = acumulador - (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
         
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

   Repetir //mientras (q < quebrados) // este bucle es indefinido, hay salida desde cada uno de los previos bucles.

   //devolver acumulador
Fin funcion

El pseudocódigo se puede optimizar, pero ya queda a tu esfuerzo... así funciona correctamente, si la ambigüedad que se plantea a continuación sale favorable a lo que he tenido que asumir como correcto...

Y ahora toca hablar de la ambigüedad...
Hay un dato ambiguo (que has dejado al aire y que no queda claro). Si los denominadores, deben ser duplicados o no, es decir el quebrado central puede ser central para ambas partes?, Si el número de quebrados debe ser siempre par, el denominador central se repetirá dos veces, pero cuando el número de quebrados sea impar, se repetirá solo 1 (ó 3 veces...) yo asumo que solo 1, pero es arriesgado, toda vez que en la serie que tú mismo pones, al final incumples tu propia regla de 3,2 ,, 3,2 ,, 3,2, pués los dos numeradores finales se repiten: 2,2 (44,55; de 4/7, 4/5, 5/3, 5/1)...
Dicho de otro modo, con tus propias reglas, la serie que pones debería ser:
S = 1/1 + 1/3 + 1/5  - 2/7 - 2/9  + 3/11 + 3/13 + 3/11 - 4/9 - 4/7 + 5/5 + 5/3 + 5/1

Separando la serie en los numeradores y denominadores (visualmente deja más claro ver la relación entre ellos):
numeradores: 01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05
denominado.: 01 03 05 , 07 09 ,,, 11 13 11 , 09 07 ,,, 05 03 01

Dada tal ambigüedad, puede ser preciso reajustar, el pseudocódigo... y eso ya lo dejo a tu esfuerzo, toda vez que ya te lo he dejado totalmente masticado y digerido. Solo te falta ensamblar las piezas... con alguna corrección menor si procede.



Nota que los bucles internos solo cambian en dos sencillas cosas: la cuenta del bucle  y el signo, ahí te lo dejo para que pienses...

MAFUS

#2
Sorry, es en C, pero creo que podrás seguirlo, es sencillo. Se basa en que con numeradores impares éstos se repiten 3 veces seguidas, con impares solo 2. De igual forma todos los numeradores impares hacen la fracción positiva, los pares la hacen negativa. La serie dura mientras el denominador sea positivo:

#include <stdio.h>

int main() {
   int n;
   int i;
   int k;
   int numerador;
   int denominador;
   int repeticiones;

   printf("> ");
   scanf("%d", &n);
   printf("S =");

   numerador = 1;
   denominador = 1;
   i = 0;
   k = 0;
   while(denominador>0) {
       // Calculo las veces que se repite el numerador
       repeticiones = 2 + numerador%2;

       printf(" %d/%d ", numerador, denominador);

       // Calculo el próximo denominador
       if(k<n-1)
           denominador += 2;
       else if(k>n-1)
           denominador -= 2;
       ++k;

       // Control del bucle de las repeticiones
       if(++i==repeticiones) {
           ++numerador;
           i=0;
       }

       // Escribo el signo
       if(denominador>0) {
           if(numerador%2)
               putchar('+');
           else
               putchar('-');
       }
   }
}

Erius

Cita de: NEBIRE en 24 Mayo 2018, 18:23 PM
Pero tu mismo te has respondido en parte...

Tienes  4 series... la del numerador, la del denominador, la del signo de operacion, y la de cambio del numerador.
Además se pueden simplificar ya que parece que el cambio de signo coinciden con el cambio del valor del numerador.
1, 1, 1, 2, 2,
+, +, +, -, -,

Una de las series es 3,2, 3,2, 3,2, 3,2... Si simplemente alterna entre dos valores, puedes poner sendos bucles uno tras otro limitados por dichos valores.


   bucle para A desde 1 a 3
       ...
   siguiente

   bucle para B desde 1 a 2
       ...  
   siguiente


Luego el numerador se mantiene con su valor en el bucle A, pero al salir aumenta en uno y se mantiene así en el bucle B, al salir aumenta... Además se ha constatado que el signo sigue 'el ritmo' del numerador, luego en el bucle A suma y en el bucle B resta
y ahora con todo esto actualizamos el código:


entero valor = Pedir numero ¿positivo?

entero numerador = 1
entero acumulador = 0
entero denominador = 1

   bucle para A desde 1 a 3
       acumulador  = acumulador + (numerador / x) //x porque aún no hemos determinado el valor del denominador.
   siguiente
   numerador +=1

   bucle para B desde 1 a 2
       acumulador  = acumulador - (numerador / x)
   siguiente
   numerador +=1



Ahora estudiemos el denominador... dices que empieza en 1 hasta alcanzar un tope. entiendo que el tope será aquel que luego le permita descender nuevamente hasta acabar en 1. Saber ese tope exige conocer cuantos quebrados compondrán la serie.
Entonces empezaremos por calcularlo, después de todo, necesitábamos saber esto aunque no se pidiera...cuando acaba la serie.
Veamos... el denominador aumenta 2 cada vez, empieza en 1 debe acabar en 1, en tanto que el numerador se repite 3 veces y luego dos antes de cambiar, es decir
El numerador necesita 5 quebrados para aumentar en 2 su valor. Luego podemos sumar 5 quebrados por cada 2 valores que se resten al tota...
numquebrados = ((Total -1) /2) * 5
Ahora bien, esa división de 2, implica que si total-1 no es par, dará decimales... miremos dos casos de ejemplo uno par y otro impar para ver como se comporta:
v = 7
v= 8
con v = 7 (mirando sólo el numerador) 111,22,,333,44,,555,66 = 15 quebrados
con v = 8 (mirando sólo el numerador) 111,22,,333,44,,555,66,,777 = 18 quebrados.
Es decir, la conclusión es clara, tal como se preveía... si v es impar (o v-1 es par), la fórmula se cumple (7-1)= 6; 6/2= 3; 3*5 = 15 justo lo que nos da...
en cambio si v= par, con la fórmula nos da: 8-1= 7; 7/2= 3'5; 3'5*5 = 17'5
Cono resulta exactamente, consideremos no restarle 1, para que sea para y la división sea entera: 8/2= 4; 4*5= 20, luego excede en 2... pues ya esta, cuando sea par seguimos esta otra formula:
quebrados = (((v/2) * 5) -2)

Todavía podría reqerir un ajuste a casua de denominador, pero éste requiere saber de antemano el número teórico de quebrados, luego primero calculamos el número teórico, y luego se actualizaría. Sin embargo debido a una ambigüedad, sin aclarar, no se lleva a cabo tal ajuste...

entero quebrados
   si ((v and 1) = 0 ) luego  // 'plis': v and 1, no: v modulo 2
       quebrados = (((v/2) * 5) -2)
   sino
       quebrados = (((v-1) /2) * 5)
   fin si


Una vez conocido la cantidad de quebrados, ahora ya podremos conocer el valor máximo del denominador:, pués llegará justo a la mitad de los quebrados.
demoninadorMax = (1 + (((quebrados-2)/2) *2)) ... lo abreviaremos a dMax...
+1, porque el denominador comienza en 1, quebrados -2, porque los dos quebrados de los extremos ya se consideran, entre 2, porque la serie crece, y luego decrece y por 2 porque el siguiente denomindador el el previo aumentado en 2.

Veamos si resulta acertado, para los valores ya conocidos (6, 7 y 8)
dMax(x) viene a decir valor máximo del denominador cuando el valor introducido sea x.
dMax(6) = (1 + (((12-2)/2*2)) = 11 (coincide con lo que pusiste)
dMax(7) = (1 + (((15-2)/2)*2) = 14
dMax(8) = (1 + (((18-2)/2)*2) = 17
Antes de comprobar si los últimos coinciden, queda claro que se puede, simplificar ya que /2*2 se anulan mutuamente. dividir algo entre 2 para luego inmediatamente multiplicalro por dos, es lo mismo que no hacer nada. Luego simplificado quedaría:
dMax = (1 + quebrados-2) , y como ahora son sumas, también se pueden simplificar...
dMax = (quebrados -1)
A hora la comprobación para v=7 y v=8 (con v=6, es 11, como ya colocaste en el enunciado).
La comprobación la hacemos colocando los numeradores y debajo la línea resultante denominadores (se antecede con 0, para que todos tengan dos cifras y visualmente coincidan las líneas).
para v = 7;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 (15 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 13 11 ,,, 09 07 05 , 03 01

para v = 8;  01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05 , 06 06 ,,, 07 07 07 (18 quebrados)
denominaD; 01 03 05 , 07 09 ,,, 11 13 15 , 17 17 ,,, 15 13 11 , 09 07 ,,, 05 03 01

Vemos que en realidad, a causa de valores pares o impares no se ajusta con la formulación... realmente no es complicado ajustarla, pero como decía más arriba hay una ambigüedad en tu especificación, luego no lo toco y resumo que como este resultado ofrece básicamente la misma cantidad de quebrados que los que nos daban pero sujeto también al condicionante de si v es par o impar, podemos simplificar que:
Si v = par; dMax = quebrados  (el máximo se repite 2 veces);
y Si v=impar; dMax= (quebrados-1) (no se repite) que es exactamente la misma conclusión a la que llegamos.

Entonces volvemos al código previo para completarlo:

entero quebrados, dMax
   si ((v and 1) = 0 ) luego  // v es par
       quebrados = (((v/2) * 5) -2)
       dMax = quebrados       // denominador central se repite.
   sino                               // v es impar
       quebrados = (((v-1) /2) * 5)
       dMax = (quebrados -1)  // denominador central no se repite.
   fin si


Y finalmente si montamos todo el código junto, con la lógica que une todas las partes...

entero valor = Pedir numero ¿positivo?
entero resultado

resultado = CalcularCustomSerie(valor)


entero = funcion CalcularCustomSerie(entero valor)
   entero numerador = 1
   entero acumulador = 0
   entero denominador = 1
   entero inc = 2
   entero quebrados, dMax, q //q lleva la cuenta de los quebrados.
   buleano vPar


   // calcular número de quebrados y valor máximo del denominador.
   vPar = ((valor and 1) = 0)      // 'plis': v and 1, no: v modulo 2    
   si (vPar = TRUE ) luego  
       quebrados = (((valor / 2) * 5) -2)
       dMax = quebrados            // denominador central se repite.
   sino // vPar = FALSE
       quebrados = (((valor -1) / 2) * 5)
       dMax = (quebrados -1)      // denominador central no se repite.
   fin si

   Hacer
       bucle para A desde 1 a 3
           acumulador  = acumulador + (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
           
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

       bucle para B desde 1 a 2
           acumulador  = acumulador - (numerador / denominador)
           q +=1
           si  (q = quebrados)  devolver acumulador
         
           si (q = dMax) luego  
               si (vPar = TRUE) luego  // denominador, se repite, no se incrementa esta vez.
                   inc = -inc   // pero si se activa que el incremento sea negativo en lo sucesivo (decremento).
               sino
                   inc = -inc                      
                   denominador += inc          
               fin si                
           sino
               denominador += inc
           fin si
       siguiente
       numerador +=1

   Repetir //mientras (q < quebrados) // este bucle es indefinido, hay salida desde cada uno de los previos bucles.

   //devolver acumulador
Fin funcion

El pseudocódigo se puede optimizar, pero ya queda a tu esfuerzo... así funciona correctamente, si la ambigüedad que se plantea a continuación sale favorable a lo que he tenido que asumir como correcto...

Y ahora toca hablar de la ambigüedad...
Hay un dato ambiguo (que has dejado al aire y que no queda claro). Si los denominadores, deben ser duplicados o no, es decir el quebrado central puede ser central para ambas partes?, Si el número de quebrados debe ser siempre par, el denominador central se repetirá dos veces, pero cuando el número de quebrados sea impar, se repetirá solo 1 (ó 3 veces...) yo asumo que solo 1, pero es arriesgado, toda vez que en la serie que tú mismo pones, al final incumples tu propia regla de 3,2 ,, 3,2 ,, 3,2, pués los dos numeradores finales se repiten: 2,2 (44,55; de 4/7, 4/5, 5/3, 5/1)...
Dicho de otro modo, con tus propias reglas, la serie que pones debería ser:
S = 1/1 + 1/3 + 1/5  - 2/7 - 2/9  + 3/11 + 3/13 + 3/11 - 4/9 - 4/7 + 5/5 + 5/3 + 5/1

Separando la serie en los numeradores y denominadores (visualmente deja más claro ver la relación entre ellos):
numeradores: 01 01 01 , 02 02 ,,, 03 03 03 , 04 04 ,,, 05 05 05
denominado.: 01 03 05 , 07 09 ,,, 11 13 11 , 09 07 ,,, 05 03 01

Dada tal ambigüedad, puede ser preciso reajustar, el pseudocódigo... y eso ya lo dejo a tu esfuerzo, toda vez que ya te lo he dejado totalmente masticado y digerido. Solo te falta ensamblar las piezas... con alguna corrección menor si procede.



Nota que los bucles internos solo cambian en dos sencillas cosas: la cuenta del bucle  y el signo, ahí te lo dejo para que pienses...




Gracias Neberi, pude responderme algunas dudas, gran aporte

Erius

Cita de: MAFUS en 24 Mayo 2018, 19:42 PM
Sorry, es en C, pero creo que podrás seguirlo, es sencillo. Se basa en que con numeradores impares éstos se repiten 3 veces seguidas, con impares solo 2. De igual forma todos los numeradores impares hacen la fracción positiva, los impares la hacen negativa. La serie dura mientras el denominador sea positivo:

#include <stdio.h>

int main() {
    int n;
    int i;
    int k;
    int numerador;
    int denominador;
    int repeticiones;

    printf("> ");
    scanf("%d", &n);
    printf("S =");

    numerador = 1;
    denominador = 1;
    i = 0;
    k = 0;
    while(denominador>0) {
        // Calculo las veces que se repite el numerador
        repeticiones = 2 + numerador%2;

        printf(" %d/%d ", numerador, denominador);

        // Calculo el próximo denominador
        if(k<n-1)
            denominador += 2;
        else if(k>n-1)
            denominador -= 2;
        ++k;

        // Control del bucle de las repeticiones
        if(++i==repeticiones) {
            ++numerador;
            i=0;
        }

        // Escribo el signo
        if(denominador>0) {
            if(numerador%2)
                putchar('+');
            else
                putchar('-');
        }
    }
}




Gracias MAFUS, y si, pude entender el código en C, muchas gracias!!!!