Está en la página 1de 7

Universidad Nacional

Programacin orientada a objetos


Carlos Orlando Solrzano V.
Grupo 7.
Solucin Parcial 1
1) Implemente en C++ la siguiente relacin de recurrencia

#include <iostream>
using namespace std;
long long sumatoria(int n);//primero declaro la funcion globamente
int main()
{
int n;
cin >> n;
cout << sumatoria(n) << endl;// imprimo el retorno de la funcion sumatoria
return 0;
}
//...............
long long sumatoria(int n)// funcion sumatoria
{
int t_sig = 0;
if (n == 0) // caso base
{
return 1;
}
for (int k = 0; k<n; k=k+1)// sumatoria
{
t_sig =t_sig + sumatoria(k)*sumatoria(n-1-k);//recurrencia
}
return t_sig;
}

2) Halle el factorial de N donde 0 < N < 10000 he imprima cuantos veces


aparece cada nmero [0,9] en l.
#include<iostream>
using namespace std;
int main()
{
int a[500000],ndigt,n,carr,cont=0;
cout<<"ingese el numero"<<endl;
cin>>n;
a[0]=1;
ndigt=0;
for(int j=n;j>=2;j--)// de derecha a izquierda
{
carr=0;
for(int i=0;i<=ndigt;i++)
{
carr=(a[i]*j)+carr; // llevar la cifra que debera aadirse al siguiente valor
multiplicado
a[i]=carr%10; // se saca el ultimo digito
carr=carr/10; // sacando el digito llevado
}
// sirve para sacar los dgitos de los ltimos dgitos de carr calculados
while(carr>0)
{
a[++ndigt]=carr%10;
carr=carr/10;
}
}
cout<<"el factorial es"<<endl;// imprimir factorial
for(int i=ndigt;i>=0;i--)
{
cout<<a[i];
}
cout<<endl<<endl<<"veces que se repite cada digito"<<endl;
for (int j=0;j<10;j++)// veces que se repite los digitos
{
for(int i=ndigt;i>=0;i--){
if (a[i]==j){
cont++;
}
}
cout<< j <<" se repite "<<cont<<" veces"<<endl;
cont=0;
}

cout<<endl;
return 0;
}

3) En un tablero de ajedrez de tamao NxN se quieren colocar k alfiles, con la


condicin de no amenazarse entre s (esto es, ningn arfil puede estar
atacando a otro alfil), dado en la entrada (para que ustedes la lean) el n y el
k imprima cuantos tableros de ajedrez diferentes puedo obtener cumpliendo
la condicin mencionada.
#include <iostream>
using namespace std;
int count = 0;
int movivalido(int arr[100][100], int i, int j, int n) {
int fila = i, column = j;
//movimiento en diagonal y para que permanezcan dentro del tablero)
while(i >= 0 && j >= 0) {//dentro del tablero
if(arr[i][j]) {
return 0;
}
i--, j--;//diagonal inferior derecha-superior izquierda
}
i = fila, j = column;
while(i < n && j < n) {
if(arr[i][j]) {
return 0;
}
i++, j++;//diagonal superior izquierda-inferior derecha
}
i = fila, j = column;
while(i >= 0 && j < n) {
if(arr[i][j]) {
return 0;
}
i--, j++;//diagonal inferior izquierda-superior derecha
}
i = fila, j = column;
while(i < n && j > 0) {
if(arr[i][j]) {
return 0;
}

i++, j--;//diagonal superior derecha-inferior izquierda


}
return 1;
}
//...................
void auxresolver_n_alfiles(int arr[100][100], int n, int fila, int col, int k, int izquierd) {
int i = fila , j = col;
if(izquierd == 0) {//va contando las posibilades
count++;
return;
}
for(i = fila; i < n; i++) {//recorre el tablero
for(j = col; j < n; j++) {
if(movivalido(arr, i, j, n)) {
arr[i][j] = 1;//si es valido llena con 1
auxresolver_n_alfiles(arr, n, i, j, k, izquierd - 1);//recursividad
arr[i][j] = 0;//de nuevo en 0 para la recursidad y mirar la otra posibilidad
}
}
fila = 0;//iniciacion
col = 0;
}
}
//..................
void resolver_n_alfiles(int n, int k) {
int arr[100][100];
int i = 0, j = 0;
for(i = 0; i < n; i++) {// el tablero se llena de ceros
for(j = 0; j < n; j++) {
arr[i][j] = 0;
}
}
auxresolver_n_alfiles(arr, n, 0, 0, k, k);// busca las posibilidades
cout<< "Existen "<<count<<" posibilidades";
}
//.......................
int main() {//funcion principal
int n,k;
cout<<"ingrese n (la dimension del tablero): ";//entradas
cin>> n;
cout<<"ingrese k (el numero de alfiles): ";
cin>> k;
cout<<endl;

resolver_n_alfiles(n, k);//salida
}

4) Se conjetura que cualquier nmero se puede expresar como la suma de


dos nmeros primos, en este caso queremos saber si un numero entero se
puede expresar como la suma de 4 nmeros primos, para este problema se
dar un N y para ese nmero se deber de imprimir los 4 nmeros primos
que sumados dan ese N, sino es posible hacer esto se deber entonces de
imprimir, Imposible.
#include <iostream>
using namespace std;
int primos(int x);//funcion que dice los primos
main()
{
int a,b,c,d,e;
int i,j,k,p,t,ver1,ver2,cont=0;
cout<<"ingrese un numero: "<<endl;
cin>>a;
cout<<endl;
for (int b=2;b<a;b++)// cuatro for para b+c+d+e
{
for (int c=2;c<a;c++)
{
for (int d=2;d<a;d++)
{
for (int e=2;e<a;e++)
{
j=primos(b);
k=primos(c);
p=primos(d);
t=primos(e);
ver1=(j==0)&&(k==0)&&(p==0)&&(t==0);//se mira que sean primos los
cuatro numeros
ver2=(b+c+d+e==a)&&(b<=c)&&(c<=d)&&(d<=e);/* se verifica que la
suma cumpla con que b+c+d+e=a
y se condiciona que la suma con iguales sumandos pero con diferente
orden no se repita*/
if (ver1&&ver2){
cout<<b<<"+"<<c<<"+"<<d<<"+"<<e<<"="<<a<<endl;//impreme
las
posibilidades
cont++;

}
}
}
}
}
if (cont==0){//si no existen posibilidades imprime imposible
cout<<"imposible";
}
cout<<endl<<endl;
}
//............
int primos(int x)//funcion para definir los primos
{
int i=2;// inicio de los numeros primos y cantidad de divisores de un numero primo
while (i<x)// primos existentes hasta el numero de entrada
{
if ((x%i)==0)//para conocer los divisores
break;
++i;
}
if (i==x)//si la cantidad de divisores es 2 significa que es primo
return(0);// retorna que es primo
else
return(1);//retorna que no es primo
}

5) Dado un numero N, escriba todas las posibles formas en las que puedo
llegar a N sumando nmeros positivos (en este caso tambin cuente el 0)
menores a l.
#include <iostream>
using namespace std;
void sumandos(int ult,int a[1000],int N,int sum);//declaramos la funcion
int main ()
{
int a[1000],N, sum = 0;
cin>>N;// ingresamos el numero
sumandos(1,a,N,sum);

return 0;
}
int nelem;
void sumandos(int ult,int a[1000],int N,int sum)
{
if (sum == N)//imprime las particiones
{
for (int i = 0 ; i < nelem; i++)
cout << a[i]<<" + " ;
cout << "0" <<endl;
return ;
}
for ( int i = ult ; i <= N - sum ; i++)//por particiones (teoria de numeros)
{
sum = sum + i;
a[nelem++] = i;
sumandos(i,a,N,sum);
sum -= i;//se deja igual q en un principio
nelem--;
}
}