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ón int 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