elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  serie chingona
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: serie chingona  (Leído 2,350 veces)
Erius

Desconectado Desconectado

Mensajes: 15


Ver Perfil
serie chingona
« en: 24 Mayo 2018, 07:54 am »

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(int argc, char *argv[]) {
  5. int numero, deno = 1,posi = 0, ban = 1, nega = 0;
  6. float serie1 = 0, serie2 = 0, serieT = 0, T;
  7.  
  8. cout << "Introduzca un numero: ";
  9. cin >> numero;
  10. cout << endl;
  11. for(int i = 1; i <= numero / 3; i++){
  12. if(ban == 1){
  13. while(posi < 3){
  14. cout << " + " << i << "/" << deno << " ";
  15. T = T + i / deno;
  16. serie1 += T;
  17. posi += 1;
  18. deno += 2;
  19. }
  20. posi = 0;
  21. ban = 0;
  22. }
  23. else{
  24. while(nega < 2){
  25. cout << " - " << i << "/" << deno << " ";
  26. T = T - i / deno;
  27. serie2 += T;
  28. nega += 1;
  29. deno += 2;
  30. }
  31. nega = 0;
  32. ban = 1;
  33. }
  34. serieT = serie1 + serie2;
  35. }
  36.  
  37. return 0;
  38. }


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


« Última modificación: 24 Mayo 2018, 07:55 am por engel lex » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: serie chingona
« Respuesta #1 en: 24 Mayo 2018, 18:23 pm »

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.

Código:
   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:

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...
Código:
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:
Código:
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...
Código:
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...


« Última modificación: 24 Mayo 2018, 18:31 pm por NEBIRE » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: serie chingona
« Respuesta #2 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 pares la hacen negativa. La serie dura mientras el denominador sea positivo:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int n;
  5.    int i;
  6.    int k;
  7.    int numerador;
  8.    int denominador;
  9.    int repeticiones;
  10.  
  11.    printf("> ");
  12.    scanf("%d", &n);
  13.    printf("S =");
  14.  
  15.    numerador = 1;
  16.    denominador = 1;
  17.    i = 0;
  18.    k = 0;
  19.    while(denominador>0) {
  20.        // Calculo las veces que se repite el numerador
  21.        repeticiones = 2 + numerador%2;
  22.  
  23.        printf(" %d/%d ", numerador, denominador);
  24.  
  25.        // Calculo el próximo denominador
  26.        if(k<n-1)
  27.            denominador += 2;
  28.        else if(k>n-1)
  29.            denominador -= 2;
  30.        ++k;
  31.  
  32.        // Control del bucle de las repeticiones
  33.        if(++i==repeticiones) {
  34.            ++numerador;
  35.            i=0;
  36.        }
  37.  
  38.        // Escribo el signo
  39.        if(denominador>0) {
  40.            if(numerador%2)
  41.                putchar('+');
  42.            else
  43.                putchar('-');
  44.        }
  45.    }
  46. }
« Última modificación: 30 Mayo 2018, 11:43 am por MAFUS » En línea

Erius

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: serie chingona
« Respuesta #3 en: 30 Mayo 2018, 04:01 am »

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.

Código:
   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:

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...
Código:
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:
Código:
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...
Código:
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
En línea

Erius

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: serie chingona
« Respuesta #4 en: 30 Mayo 2018, 04:03 am »

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:

Código:
#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!!!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PIC serie 12F
Electrónica
jackson.link 0 1,983 Último mensaje 23 Febrero 2006, 01:46 am
por jackson.link
serie avi a mpg
Multimedia
bader 1 1,603 Último mensaje 2 Enero 2008, 02:17 am
por Songoku
Serie.js
WarZone
Jhonjhon_1323 2 2,814 Último mensaje 13 Enero 2010, 20:09 pm
por Jhonjhon_1323
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines