Santiago Pareja Pérez
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | //NOTA: este programa requiere que el compilador esté configurado para utilizar el estándar C++11 o superior.//Este programa determina un polinomio f(x) tal que f(i)=a_i para la secuencia de enteros (a_1, a_2, ..., a_n) introducida por el usuario.//Utiliza para ello la interpolación polinómica de Newton (también conocido como método de diferencias),//creando una tabla de diferencias sucesivas de los enteros introducidos. Los detalles se pueden consultar en la web.#include <iostream>#include <string>#include <vector>using namespace std;int factorial(int x); //declaramos la funciónint main(){ cout << "Introduzca una secuencia de enteros separados por espacios y terminada en un punto." << endl; //ejemplo: 1 2 3 4 5. int number; vector<int> fx; while(cin >> number){ //el bucle parará cuando encuentre algo que no pueda interpretar como un número. //cada cin lee solo hasta el siguiente espacio. fx.push_back(number); //leemos los números del buffer y los colocamos en un vector (una estructura parecida a un array pero de tamaño dinámico). }; vector<vector<int>> diffs; //vector de vectores, para calcular las diferencias sucesivas. diffs.push_back(fx); int count = 0; while(true){ bool break_while = false; vector<int> result; cout << "D_" << count << "(x): "; for(int i = 0; i+1 < diffs[count].size(); //queremos que i+1 sea siempre estrictamente menor al tamaño del vector. ++i){ cout << diffs[count][i] << " "; //imprimimos el valor de cada elemento, nos dará una tabla de diferencias. int dif = diffs[count][i+1] - diffs[count][i]; result.push_back(dif); } cout << diffs[count][diffs[count].size()-1] << endl; //imprime el último valor del vector, que nos habíamos dejado en el anterior bucle. diffs.push_back(result); count += 1; //Primera condición de salida: que una fila tenga un único número. if(diffs[count-1].size() == 1){ break; } //Segunda condición de salida: que todos los números de una fila sean ceros. for(int i = 0; i < diffs[count].size(); //este count es 1 mayor al del bucle anterior, //ya que estamos iterando sobre los elementos de la fila que acabamos de generar. ++i){ if(diffs[count][i]!=0){ break_while = false; //no es lo más elegante, pero nos permite romper el bucle while desde dentro del bucle for. break; } else{ break_while = true; } } if(break_while){ break; } }; cout << endl << "Polinomio generado:" << endl << endl; //Tomamos el primer valor de cada fila para generar el polinomio: string x = ""; for(int i = 0; i < diffs.size()-1; //existe un vector nulo al final de diffs. i++){ int a = diffs[i][0]; if(i==0){ cout << a; //podemos omitir coeficientes innecesarios en el primer factor. } else{ x += "(x-"+to_string(i)+")"; cout << a << '/' << factorial(i) << '*' << x; } if(i != diffs.size()-2){ //evita que haya un "+" suelto al final del polinomio. cout << '+' << endl; } } cout << '.' << endl; return 0;}int factorial(int x){ if(x == 0 || x == 1){ return 1; //0! = 1! = 1 } int fact = 1; int c = 2; //contador while(c <= x){ //terminar el bucle si c>x fact *= c; c += 1; } return fact;} |
Anuncios