Hola buenas, tengo una par de problemas y llevo un par de dias buscando y dandole vueltas y no saco nada en claro.
El primer problema es conseguir que me diga si el numero de 3 cifras insertado es igual a la suma de sus cubos, por ej 153=1^3+5^3+3^3.
Lo que no se hacer es descomponer el numero para elevar al cubo sus digitos, y por mas que le doi vueltas no se me ocurre nada.
Mi segunda duda es conseguir el seno a partir de el polinomio de Taylor y aqui si que estoy completamente perdido (mas aun que en el otro).
Si alguien mas puesto en esto me pudiera ayudar lo agradeceria enormemente, gracias por vuestro tiempo y saludos!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
numeros = raw_input("Numero>")
x = ""
for numero in numeros:
resultado = pow(int(numero),3)
x = x + str(resultado)
if x == str(numeros):
print x + " y " + str(numeros) + " son iguales"
else:
print x + " y " + str(numeros) + " no son iguales"
En python sería algo así, fíjate en lo que hace el programa e implementalo en C ya que no se pueden postear los resultados de los ejercicios :)
Un saludo :)
Hola! una pista, tomamos 153 como ejemplo:
153%10
el resto va a ser 3
153/10
el resultado va a ser 15
15%10
resto 5
15/10
resultado 1
1%10
resto 1
Aplicalo a tu codigo y tendria q salir. Saludos
Cita de: durasno en 6 Abril 2012, 20:55 PM
Hola! una pista, tomamos 153 como ejemplo:
153%10
el resto va a ser 3
153/10
el resultado va a ser 15
15%10
resto 5
15/10
resultado 1
1%10
resto 1
Aplicalo a tu codigo y tendria q salir. Saludos
Jaja nunca hubiese pensado en eso, es buen método ;-)
EDIT: Es curioso, lo he escrito y no me devuelve los números que debería devolver :S
muchas gracias a los 2 por vuestras respuestas.
durasno, eso es lo que estaba aplicando, el problema es que no se como hacer para que me eleve ese resto al cubo (soi un ignorante en este tema), o sea, como guardar ese resto para elevarlo despues, o si el programa lo guarda..
Cita de: mmaikel en 6 Abril 2012, 21:05 PM
muchas gracias a los 2 por vuestras respuestas.
durasno, eso es lo que estaba aplicando, el problema es que no se como hacer para que me eleve ese resto al cubo (soi un ignorante en este tema), o sea, como guardar ese resto para elevarlo despues, o si el programa lo guarda..
mmaikel para elevarlo al cubo debes importar la libreria <math.h>
y debes usar la función pow().
Puedes inicializar una variable y realizar la operacion en ella así:
int primnumero = numero % 10;
int segonumero = primnumero / 10;
y así cuando tengas los dígitos que necesitas, utilizas pow y lo guardas en una variable:
resultado = pow(primnumero,3) + pow(segonumero,3) + pow(tercenumero,3);
Un saludo mmaikel :)
De nuevo muchas gracias, asi es como lo estoy intentando, pero me pone el siguiente error 17 " call of overloaded `pow(int&, int)' is ambiguous ". Tengo importada la libreria <cmath> y lo que hago es, por ejemplo:
int num,a,res;
a=num%10;
cin>>a;
res=pow(a,3);
cin>>res;
y a partir de aqui ponerle la condicion que si son iguales las sumas de los cubos con el numero (num)
Hola! me olvide d aclarar que no se C++, solo C. una pregunta¿el cin no se usa para ingreso de caracteres??? y para q lo haces?
en "a" se va a guardar el resto de la division (num%10) que es un entero y vos le queres meter un caracter(cin>>a) .. El error de pow puede q se deba a eso
Saludos
ahh al final tambien pones un cin
Lo estoy haciendo sin el 'pow' de la siguiente manera:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int num,x,y,a,b,c,res,prim,sec,ter;
cout<<"Introduzca una cifra de 3 digitos: "<<endl;
cin>>num;
{
for (num>=000;num<=999;)
a=num%10;
x=num/10;
b=x%10;
y=x/10;
c=y%10;
prim=a*a*a;
sec=b*b*b;
ter=c*c*c;
res=prim+sec+ter;
if (res=num)
cout << "El resultado de la suma de los cubos de los digitos es igual al numero" << endl;
else
cout <<"El resultado de la suma de los cubos de los digitos no es igual al numero"<< endl;
}
system ("pause");
return 0;
}
Me lo compila perfectamente, pero el programa no hace nada.. xD
Cita de: mmaikel en 6 Abril 2012, 23:02 PM
Lo estoy haciendo sin el 'pow' de la siguiente manera:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int num,x,y,a,b,c,res,prim,sec,ter;
cout<<"Introduzca una cifra de 3 digitos: "<<endl;
cin>>num;
{
for (num>=000;num<=999;)
a=num%10;
x=num/10;
b=x%10;
y=x/10;
c=y%10;
prim=a*a*a;
sec=b*b*b;
ter=c*c*c;
res=prim+sec+ter;
if (res=num)
cout << "El resultado de la suma de los cubos de los digitos es igual al numero" << endl;
else
cout <<"El resultado de la suma de los cubos de los digitos no es igual al numero"<< endl;
}
system ("pause");
return 0;
}
Me lo compila perfectamente, pero el programa no hace nada.. xD
Haz un bucle FOR como dios manda!
El primer argumento del bucle for es inicializar una variable, como por ejemplo, int i = 0;
El segundo argumento es la comparacion. Mientras se cumpla la comparacion, se ejecutara el codigo. Por ej. i<50;
El tercer argumento es el modificador. i++, i--, i+=2, etc.
Lo que estas haciendo en el bucle no se lo que es. Ninguno de los argumentos concuerdan.
Por ejemplo: for (int i = 0; i<100; i++) {ejecutar lo que sea}
Por cierto, system pause es una muy mala practica.
me imaginaba que la entrada la hacias con caracteres, en fin si hubieses leido lo que te mande... T dejo el codigo en C
#include <stdio.h>
#include <math.h>
int main(void)
{
int num,res;
int suma=0;
int auxNum;
printf("Ingrese un numero\n");
scanf("%d",&num);
auxNum=num;
for(;num>0;)
{
res=num%10;
suma+=pow(res,3);
num/=10;
}
if(auxNum==suma)
printf("Bien, num=%d igual a suma=%d\n",auxNum,suma);
else
printf("Mal\n");
return 0;
}
Fijate q la entrada es de un entero no de caracteres... Si vas a seguir usando cin busca una funcion que te convierte esa cadena en su representacion a entero
Saludos
PD: si vas a compilar en devC++ cambia el pow(res,3) por res*res*res. No entiendo xq me anda mal con Dev C++
Y qué tal si tratáis el número como una cadena?
#include <stdio.h>
#include <math.h>
int Atoi (char car)
{ switch (car)
{ case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3;
case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7;
case '8': return 8; case '9': return 9; default : return -1;
}
}
int main (int argc, char *argv [])
{ if (argc != 2) { printf ("Use: code <num>\n"); return 1; }
int resultado=0, a;
for (a=0; a<strlen (argv [1]); a++) resultado+=pow (Atoi (argv [1][a]), strlen (argv [1])-a);
printf ("%d\n", resultado); return 0;
}
Mil gracias a todos.. no se por que no me compila el dev c++ con el pow, y farresito gracias por lo del FOR, como ya dije soy un completo ignorante en esa materia, apenas estoy empezando a hacer pijotadillas de estas..y la verdad es que me esta empezando a gustar esto..xD
Saludos y gracias de nuevo
Cita de: mmaikel en 6 Abril 2012, 23:02 PM
Lo estoy haciendo sin el 'pow' de la siguiente manera:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int num,x,y,a,b,c,res,prim,sec,ter;
cout<<"Introduzca una cifra de 3 digitos: "<<endl;
cin>>num;
{
for (num>=000;num<=999;)
a=num%10;
x=num/10;
b=x%10;
y=x/10;
c=y%10;
prim=a*a*a;
sec=b*b*b;
ter=c*c*c;
res=prim+sec+ter;
if (res=num)
cout << "El resultado de la suma de los cubos de los digitos es igual al numero" << endl;
else
cout <<"El resultado de la suma de los cubos de los digitos no es igual al numero"<< endl;
}
system ("pause");
return 0;
}
Me lo compila perfectamente, pero el programa no hace nada.. xD
Ah, me olvidada.
Usa un titulo mas descriptivo cuando crees temas.
Y despues, para comparar dos numeros, hay que hacer ==, no =, porque este ultimo lo que hace es asignar, lo que devuelve el valor true.
Cita de: farresito en 6 Abril 2012, 23:43 PM
Ah, me olvidada.
Usa un titulo mas descriptivo cuando crees temas.
Y despues, para comparar dos numeros, hay que hacer ==, no =, porque este ultimo lo que hace es asignar, lo que devuelve el valor true.
si, ahi me cole, pero lo tenia bien en el programa.. y una cosa, por que lo del system (pause) es una mala practica?
Cita de: mmaikel en 6 Abril 2012, 23:47 PM
si, ahi me cole, pero lo tenia bien en el programa.. y una cosa, por que lo del system (pause)?
No es portable, esto es, tan solo funciona en Windows. Es una funcion muy pesada (necesita bastantes recursos) porque hace lo siguiente:
Suspender el programa
Llamar el Sistema Operativo
Abre una shell de la terminal
Busca la funcion PAUSE
Reserva memoria
Ejecuta el comando y espera una pulsacion
Elimina la memoria reservada
Resume el programa
Sabes la famosa ventana negra de Windows (la terminal) muy usada en las peliculas de hackers? Vamos, como la que te sale cuando compilas los programas? Ahi puedes ejecutar comandos como ipconfig y otras cosas. Pues la funcion system lo que hace es ejecutar lo que le pasas por parametro (lo que uno ejecutaria manualmente en una de esas terminale) y devuelve el valor, si no me equivoco (hace tiempo que no uso Windows, demasiado).
para sacar el seno usando el teorema de taylor debes sacar la derivada primera igualar a cero ..a ese resultado le volves a sacar la derivada e igualas a cero...asi eternamente depende del nivel de error que quieras después de que digito a la izquierda de la coma
Citarx-(x^3)/3! +(x^5)/5!-(x^¨7)/7!
ejemplo el 7!=7*6*5*4*3*2*1 osea usa for para que lo multiplique hasta llegar a 1 o para no complicarte tanto lo pones como una constante (obvio previo uso de calculadora en mano, pero creo que la idea debe ser que uses for) una ayudita lee
Citarhttp://codigoc.org/page/5
... así con el resto de números factoriales...se supone que x seria la variable a la cual vos le ingresas el numero
Para el ejercicio del polinomio de Taylor lo que estoy haciendo es lo siguiente:
siguiendo la formula
(http://upload.wikimedia.org/wikipedia/es/math/7/6/c/76c755ef67f36ae953ba432a51820b21.png)
#include <iostream>
#include <cmath>
#define PI 3.141592654
using namespace std;
int main()
{
int x,n,sen;
cout << "Ingrese el numero de terminos a aproximar: " << endl;
cin >> n;
cout << "Ingrese el valor de angulo: " << endl;
cin >> x;
cout << "seno" << x << ": " << sen << endl;
system("pause");
return 0;
}
double a;
a = x*PI/180;
Primer problema, me da error en 'a'.
Alguien me podria decir por que?
una pregunta tonta...donde ves pi=3.1415 en esa serie?
ejemplo si quieres y según el grado de error que quieras en decimales (porque taylor es solo una aproximación a la función seno) vas a tener la cantidad de sumandos yo te di hasta 3, podes hacerla hasta el infinito si tenes ganas de complicarte la vida.
bueno en definitiva queres 6 sumandos n sera hasta 6 y vas cambiando en esa serie que da con uno que da con dos asi hasta llegar a seis, una vez echo eso quedara una funcion parecida a la que te di.....echo eso recien vas a poder usarla para poner el valor que quieras a x y te dara la aproximacion a seno....
Sin animo de ofender matematicas avanzadas muy poco cierto?
por otro lado double a;
a = x*PI/180;
esta fuera de main por eso el error pero igual no es esa la formula que te piden
para no estar haciendo continuamente PI/180 mejor pongan 0.17 que es constante tmb, aunque sin demasiada precisión
algo así
#define PI 3.1415
#define pisobre180 0.17
para no tener que estar haciendo una divisón continuamente cada vez que se usa 0.17
EDIT: quise poner
#define pisobre180 0.17
mas o menos seria algo así...no lo probé porque me voy a jugar al fútbol probala y me decís
#include<iostream>
using namespace std;
int factorial(int n)
{
int fact =1;
for(int i=2; i<=n; i++)
{
fact = fact * i;
}
return fact;
}
int numerador(int n)
{
int numera;
if (n % 2 ==0)
{
numera=1;
}
else
{
numera=-1;
}
return numera;
}
float exponente (int n, float x)
{
int expo;
float potencia;
expo=2*n+1;
for (int i=2;i==expo;i++)
{
potencia=x*x;
}
return potencia;
}
int main()
{
int n;
float resultado;
float x;
int fact;
int numera;
float potencia;
cout << "Ingrese el numero de terminos a aproximar: " << endl;
cin >> n;
cout << "Ingrese el valor de angulo: " << endl;
cin >> x;
fact = factorial(n);
numera = numerador(n);
potencia = exponente (n, x);
resultado = numera / fact * potencia;
cout << " el resultado es " << resultado << endl;
system ("pause");
return 0;
}
fallo persiste..
#include <iostream>
#include <cmath>
#define PI 3.141592654
using namespace std;
int main()
{
int x,n,b,fact,fac,i,num;
cout << "Ingrese el numero de terminos a aproximar: " << endl;
cin >> n;
cout << "Ingrese el valor de angulo: " << endl;
cin >> x;
{
int num;
if (n%2==0)
num=1;
else
num=-1;
}
float rad;
rad = (x*PI)/180;
{
int fac=1;
fact=2*n+1;
for (b=1 ; b<=fact ; b++)
fac=b*fac;
}
double sen = 0;
for (i=0; i<=n; i++)
{
sen=sen+(num*pow(rad,fact)/fac);
}
cout << "seno " << x << ": " << sen << endl;
system("pause");
return 0;
}
si vos lo decis....pero sogue mal planteado el problema
sen=sen+(num*pow(rad,fact)/fac);
la serie de taylor es para no usar seno...y allí lo estas usando. si mal no recuerdo el teorema decía "toda función puede ser representada por un polinomio " la idea de usar ese teorema es calcular una función podría ser seno coseno etc que quede un polinomio y dependiendo del grado de error que quieras los sumandos de la serie.
Pero bue si vos lo decís así debe ser