#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
using namespace std;
// Funciones pregunta 1
void aleatorio(int *v, int N){
for(int i = 0; i<N; i++){
*(v+i) = (rand()% (2*N)+1) + N; // El +1 es necesario, pues caso contrario se generan hasta 2N-1
}
return;
}
// Funciones pregunta 2
bool EsPrimo(int n){
for(int i = 2; i<n; i++){
if(n % i == 0){
return false;
}
}
return true;
}
int *primo(int v[], int *n, int *m, int N){
for(int i = 0; i<m-n; i++){
if(EsPrimo(v[i])){
return &v[i];
}
}
return 0;
}
void intercambiar(int *a, int*b){ //Intercambia dos variables
int aux = *a;
*a = *b;
*b = aux;
return;
}
int numprim(int *v, int N){ //Contabiliza la cantidad de números primos en el arreglo
int j = 0;
for(int i = 0; i<N; i++){
if(EsPrimo(*(v+i))){
j++;
}
}
return j;
}
int *minimo(int *v, int *dim){ //Devuelve la posición del menor número
int *min = v;
for(int i = 0; i<dim-v; i++){
if(*(v+i) < *min){
min = v+i;
}
}
return min;
}
void ordenaraux(int *n, int*m){ //Ordena un vector desde la posicion n hasta la posicion m
for(int i = 0; i<m-n; i++){
intercambiar((n+i),minimo((n+i),m));
}
}
void ordenar_primos(int v[],int N){
int *j;
int k = 0;
for(int i = 0; i<N; i++){ //Este bloque pone a los numeros primos a la derecha y los no primos a la izquierda (sin orden)
j = primo(v,&v[i],&v[N],N); //Asigna a j el primer primo encontrado
if(j != 0){
intercambiar(j,&v[N-k-1]); //Si j no es cero lo manda al final del vector, y si ee jugar ya esta ocupado por
k++; //un primo lo pone una posición antes
}
}
int a = numprim(v,N); //Asigna a "a" el valor del numero de primos que hay en el arreglo
ordenaraux(&v[0],&v[N-a]); //Ordena los numeros de 0 hasta la posición N-a, es decir los no primos
ordenaraux(&v[N-a],&v[N]); //Ordena los numeros de N-a hasta la posición N, es decir los primos
}
// Funciones pregunta 3
void llenar(double a_n[], double x, int N){
for(int i = 0; i<N; i++){
a_n[i] = pow(-1,i) * pow(x,-1-i);
}
}
double Serie(double a[], double x, int N, double *S, double delta){
for(int i = 0; i<N; i++){
if(abs(a[i]) < delta){ //Por definición del valor absoluto se tiene las condiciones dadas en menos espacio
*S += a[i];
} else{
*S += pow(a[i],2);
}
}
return *S;
}
int main(){
int n;
srand(time(NULL)); //Para generar números aleatorios, si no se escribe esta linea siempre saldrá el mismo
cout<<"Ingrese el ejercicio: "; cin>>n;
switch(n){
case 1:{
int N;
cout<<"Ingrese el valor de N: "; cin>>N;
int v[N];
aleatorio(v,N);
cout<<endl;
cout<<"El vector generado es: "<<endl;
for(int i = 0; i<N; i++){
cout<<v[i]<<"\t";
}
break;
}
case 2:{
int N;
cout<<"Ingrese el valor de N: "; cin>>N;
int v[N];
aleatorio(v,N); //Se genera un vector aleatorio de dimensión N
cout<<"Vector generado: "<<endl;
for(int i = 0; i<N; i++){
cout<<v[i]<<"\t";
}
cout<<endl<<endl;
ordenar_primos(v,N);
cout<<"Vector ordenado: "<<endl;
for(int i = 0; i<N; i++){
cout<<v[i]<<"\t";
}
break;
}
case 3:{
int N;
double x;
double delta;
cout<<"Ingrese el valor de N mayor a 1: "; cin>>N;
cout<<"Ingrese el valor de x mayor a 2: "; cin>>x;
cout<<"Ingrese el valor de delta entre 0 y 1: "; cin>>delta;
double a_n[N];
llenar(a_n,x,N);
double S=0;
Serie(a_n,x,N,&S,delta);
cout<<endl;
cout<<"El valor de la serie es: "<<S;
break;
}
default : {cout<<"Ejercicio no valido";
break;
}
}
}