Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: elkiy en 26 Mayo 2013, 03:25 am



Título: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: elkiy en 26 Mayo 2013, 03:25 am
Hola amigos, bueno el titulo lo dice todo, hice un programa que puede leer un numero binario de hasta 10 caracteres y  los pasa a base 10. bueno espero que alguno le sirva, o simplemente le guste mi codigo y como he trabajo, siempre separando la interfaz de la implementacion.

Bueno las partes:

MAIN.CPP

Código
  1. #include "funciones.h"
  2.  
  3. int main()
  4. {
  5. funciones Objetollamador;
  6. Objetollamador.PedirNumero();
  7. return 0;
  8. }


FUNCIONES.CPP

Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. using std::cin;
  5.  
  6. #include "funciones.h"
  7.  
  8. void funciones::PedirNumero()
  9. {
  10. int Numero;
  11. int NumeroCaracteres;
  12. cout << "Solo se pueden escribir numeros que contengan 0 y 1 (que sea un numero binario)"
  13.    " y el programa acepta un numero con 10 caracteres o menos, de lo contrario\n"
  14. " el resultado no sera el deseado.\n";
  15. cout << "Escriba su numero:\t";
  16. cin >> Numero;
  17. cout << "Escriba la cantidad de caracteres que tiene su numero:\t";
  18. cin >>  NumeroCaracteres;
  19. cout << "Obteniendo valores...\n";
  20.  
  21. funciones::ExaminarNumero(Numero,NumeroCaracteres);
  22.  
  23. }
  24.  
  25. int funciones::ExaminarNumero(int Numero, int NumeroCaracteres)
  26. {
  27.  
  28. int NumeroCaracteres1 = NumeroCaracteres;
  29. int Numero1 = Numero;
  30.  
  31. if (Numero1 <= 9999999999)
  32. {
  33. if (Numero1 > 999999999) // si tiene 10 caracteres
  34. {
  35. int variable;
  36. int division1;
  37. int division2;
  38. int division3;
  39. int division4;
  40. int division5;
  41. int division6;
  42. int division7;
  43. int division8;
  44. int division9;
  45. int division10;
  46.  
  47. division10 = Numero1 / 1000000000;
  48. variable = Numero1 %   1000000000;
  49. division9 = variable / 100000000;
  50. variable = variable %  100000000;
  51. division8 = variable / 10000000;
  52. variable = variable %  10000000;
  53. division7 = variable / 1000000;
  54. variable = variable %  1000000;
  55. division6= variable /  100000;
  56. variable = variable %  100000;
  57. division5 = variable / 10000;
  58. variable = variable %  10000;
  59. division4 = variable / 1000;
  60. variable = variable %  1000;
  61. division3= variable /  100;
  62. variable = variable %  100;
  63. division2= variable /  10;
  64. variable = variable %  10;
  65. division1 = variable / 1;
  66. variable = variable %  1;
  67.  
  68. //Pasando a base 10.
  69. division10= division10 * 512;
  70. division9= division9 * 256;
  71. division8= division8 * 128;
  72. division7= division7 * 64;
  73. division6= division6 * 32;
  74. division5= division5 * 16;
  75. division4= division4 * 8;
  76. division3= division3 * 4;
  77. division2= division2 * 2;
  78. division1= division1 * 1;
  79.  
  80. variable = (division1 + division2 + division3 + division4 + division5 + division6
  81. + division7 + division8 + division9 + division10);
  82.  
  83. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  84. cin.get();
  85. cin.get();
  86.  
  87.  
  88. }
  89. if ((Numero1 < 1000000000) & (Numero1 > 99999999)) // si tiene 9 caracteres
  90. {
  91. int variable;
  92. int division1;
  93. int division2;
  94. int division3;
  95. int division4;
  96. int division5;
  97. int division6;
  98. int division7;
  99. int division8;
  100. int division9;
  101. int division10;
  102.  
  103. division10 = Numero1 / 1000000000;
  104. variable = Numero1 %   1000000000;
  105. division9 = variable / 100000000;
  106. variable = variable %  100000000;
  107. division8 = variable / 10000000;
  108. variable = variable %  10000000;
  109. division7 = variable / 1000000;
  110. variable = variable %  1000000;
  111. division6= variable /  100000;
  112. variable = variable %  100000;
  113. division5 = variable / 10000;
  114. variable = variable %  10000;
  115. division4 = variable / 1000;
  116. variable = variable %  1000;
  117. division3= variable /  100;
  118. variable = variable %  100;
  119. division2= variable /  10;
  120. variable = variable %  10;
  121. division1 = variable / 1;
  122. variable = variable %  1;
  123.  
  124. //Pasando a base 10.
  125. division9= division9 * 256;
  126. division8= division8 * 128;
  127. division7= division7 * 64;
  128. division6= division6 * 32;
  129. division5= division5 * 16;
  130. division4= division4 * 8;
  131. division3= division3 * 4;
  132. division2= division2 * 2;
  133. division1= division1 * 1;
  134.  
  135. variable = (division1 + division2 + division3 + division4 + division5 + division6
  136. + division7 + division8 + division9);
  137.  
  138. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  139. cin.get();
  140. cin.get();
  141. }
  142. if ((Numero1 < 100000000 & Numero1 > 9999999) ) // si tiene 8 caracteres
  143. {
  144. int variable;
  145. int division1;
  146. int division2;
  147. int division3;
  148. int division4;
  149. int division5;
  150. int division6;
  151. int division7;
  152. int division8;
  153. int division9;
  154. int division10;
  155.  
  156. division10 = Numero1 / 1000000000;
  157. variable = Numero1 %   1000000000;
  158. division9 = variable / 100000000;
  159. variable = variable %  100000000;
  160. division8 = variable / 10000000;
  161. variable = variable %  10000000;
  162. division7 = variable / 1000000;
  163. variable = variable %  1000000;
  164. division6= variable /  100000;
  165. variable = variable %  100000;
  166. division5 = variable / 10000;
  167. variable = variable %  10000;
  168. division4 = variable / 1000;
  169. variable = variable %  1000;
  170. division3= variable /  100;
  171. variable = variable %  100;
  172. division2= variable /  10;
  173. variable = variable %  10;
  174. division1 = variable / 1;
  175. variable = variable %  1;
  176.  
  177. //Pasando a base 10.
  178. division8= division8 * 128;
  179. division7= division7 * 64;
  180. division6= division6 * 32;
  181. division5= division5 * 16;
  182. division4= division4 * 8;
  183. division3= division3 * 4;
  184. division2= division2 * 2;
  185. division1= division1 * 1;
  186.  
  187. variable = (division1 + division2 + division3 + division4 + division5 + division6
  188. + division7 + division8);
  189.  
  190. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  191. cin.get();
  192. cin.get();
  193. }
  194. if ((Numero1 < 10000000  & Numero1 > 999999) ) // si tiene 7 caracteres
  195. {
  196. int variable;
  197. int division1;
  198. int division2;
  199. int division3;
  200. int division4;
  201. int division5;
  202. int division6;
  203. int division7;
  204. int division8;
  205. int division9;
  206. int division10;
  207.  
  208. division10 = Numero1 / 1000000000;
  209. variable = Numero1 %   1000000000;
  210. division9 = variable / 100000000;
  211. variable = variable %  100000000;
  212. division8 = variable / 10000000;
  213. variable = variable %  10000000;
  214. division7 = variable / 1000000;
  215. variable = variable %  1000000;
  216. division6= variable /  100000;
  217. variable = variable %  100000;
  218. division5 = variable / 10000;
  219. variable = variable %  10000;
  220. division4 = variable / 1000;
  221. variable = variable %  1000;
  222. division3= variable /  100;
  223. variable = variable %  100;
  224. division2= variable /  10;
  225. variable = variable %  10;
  226. division1 = variable / 1;
  227. variable = variable %  1;
  228.  
  229. //Pasando a base 10.
  230. division7= division7 * 64;
  231. division6= division6 * 32;
  232. division5= division5 * 16;
  233. division4= division4 * 8 ;
  234. division3= division3 * 4;
  235. division2= division2 * 2;
  236. division1= division1 * 1;
  237.  
  238. variable = (division1 + division2 + division3 + division4 + division5 + division6
  239. + division7);
  240.  
  241. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  242. cin.get();
  243. cin.get();
  244. }
  245. if ((Numero1 < 10000000  & Numero1 > 99999 )) // si tiene 6 caracteres
  246. {
  247. int variable;
  248. int division1;
  249. int division2;
  250. int division3;
  251. int division4;
  252. int division5;
  253. int division6;
  254. int division7;
  255. int division8;
  256. int division9;
  257. int division10;
  258.  
  259. division10 = Numero1 / 1000000000;
  260. variable = Numero1 %   1000000000;
  261. division9 = variable / 100000000;
  262. variable = variable %  100000000;
  263. division8 = variable / 10000000;
  264. variable = variable %  10000000;
  265. division7 = variable / 1000000;
  266. variable = variable %  1000000;
  267. division6= variable /  100000;
  268. variable = variable %  100000;
  269. division5 = variable / 10000;
  270. variable = variable %  10000;
  271. division4 = variable / 1000;
  272. variable = variable %  1000;
  273. division3= variable /  100;
  274. variable = variable %  100;
  275. division2= variable /  10;
  276. variable = variable %  10;
  277. division1 = variable / 1;
  278. variable = variable %  1;
  279.  
  280. //Pasando a base 10.
  281. division6= division6 * 32;
  282. division5= division5 * 16;
  283. division4= division4 * 8;
  284. division3= division3 * 4;
  285. division2= division2 * 2;
  286. division1= division1 * 1;
  287.  
  288. variable = (division1 + division2 + division3 + division4 + division5 + division6);
  289.  
  290. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  291. cin.get();
  292. cin.get();
  293. }
  294. if ((Numero1 < 100000 & Numero1 > 9999)) // si tiene 5 caracteres
  295. {
  296. int variable;
  297. int division1;
  298. int division2;
  299. int division3;
  300. int division4;
  301. int division5;
  302. int division6;
  303. int division7;
  304. int division8;
  305. int division9;
  306. int division10;
  307.  
  308. division10 = Numero1 / 1000000000;
  309. variable = Numero1 %   1000000000;
  310. division9 = variable / 100000000;
  311. variable = variable %  100000000;
  312. division8 = variable / 10000000;
  313. variable = variable %  10000000;
  314. division7 = variable / 1000000;
  315. variable = variable %  1000000;
  316. division6= variable /  100000;
  317. variable = variable %  100000;
  318. division5 = variable / 10000;
  319. variable = variable %  10000;
  320. division4 = variable / 1000;
  321. variable = variable %  1000;
  322. division3= variable /  100;
  323. variable = variable %  100;
  324. division2= variable /  10;
  325. variable = variable %  10;
  326. division1 = variable / 1;
  327. variable = variable %  1;
  328.  
  329. //Pasando a base 10.
  330. division5= division5 * 16;
  331. division4= division4 * 8;
  332. division3= division3 * 4;
  333. division2= division2 * 2;
  334. division1= division1 * 1;
  335.  
  336. variable = (division1 + division2 + division3 + division4 + division5);
  337.  
  338. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  339. cin.get();
  340. cin.get();
  341. }
  342. if ((Numero1 < 10000 & Numero1 > 999)) // si tiene 4 caracteres
  343. {
  344. int variable;
  345. int division1;
  346. int division2;
  347. int division3;
  348. int division4;
  349. int division5;
  350. int division6;
  351. int division7;
  352. int division8;
  353. int division9;
  354. int division10;
  355.  
  356. division10 = Numero1 / 1000000000;
  357. variable = Numero1 %   1000000000;
  358. division9 = variable / 100000000;
  359. variable = variable %  100000000;
  360. division8 = variable / 10000000;
  361. variable = variable %  10000000;
  362. division7 = variable / 1000000;
  363. variable = variable %  1000000;
  364. division6= variable /  100000;
  365. variable = variable %  100000;
  366. division5 = variable / 10000;
  367. variable = variable %  10000;
  368. division4 = variable / 1000;
  369. variable = variable %  1000;
  370. division3= variable /  100;
  371. variable = variable %  100;
  372. division2= variable /  10;
  373. variable = variable %  10;
  374. division1 = variable / 1;
  375. variable = variable %  1;
  376.  
  377. //Pasando a base 10.
  378. division4= division4 * 8;
  379. division3= division3 * 4;
  380. division2= division2 * 2;
  381. division1= division1 * 1;
  382.  
  383. variable = (division1 + division2 + division3 + division4);
  384.  
  385. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  386. cin.get();
  387. cin.get();
  388. }
  389. if ((Numero1 < 1000) & (Numero1 > 99)) // si tiene 3 caracteres
  390. {
  391. int variable;
  392. int division1;
  393. int division2;
  394. int division3;
  395. int division4;
  396. int division5;
  397. int division6;
  398. int division7;
  399. int division8;
  400. int division9;
  401. int division10;
  402.  
  403. division10 = Numero1 / 1000000000;
  404. variable = Numero1 %   1000000000;
  405. division9 = variable / 100000000;
  406. variable = variable %  100000000;
  407. division8 = variable / 10000000;
  408. variable = variable %  10000000;
  409. division7 = variable / 1000000;
  410. variable = variable %  1000000;
  411. division6= variable /  100000;
  412. variable = variable %  100000;
  413. division5 = variable / 10000;
  414. variable = variable %  10000;
  415. division4 = variable / 1000;
  416. variable = variable %  1000;
  417. division3= variable /  100;
  418. variable = variable %  100;
  419. division2= variable /  10;
  420. variable = variable %  10;
  421. division1 = variable / 1;
  422. variable = variable %  1;
  423.  
  424. //Pasando a base 10.
  425. division3= division3 * 4;
  426. division2= division2 * 2;
  427. division1= division1 * 1;
  428.  
  429. variable = (division1 + division2 + division3);
  430.  
  431. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  432. cin.get();
  433. cin.get();
  434. }
  435. if ((Numero1 < 100 & Numero1 > 9) ) // si tiene 2 caracteres
  436. {
  437. int variable;
  438. int division1;
  439. int division2;
  440. int division3;
  441. int division4;
  442. int division5;
  443. int division6;
  444. int division7;
  445. int division8;
  446. int division9;
  447. int division10;
  448.  
  449. division10 = Numero1 / 1000000000;
  450. variable = Numero1 %   1000000000;
  451. division9 = variable / 100000000;
  452. variable = variable %  100000000;
  453. division8 = variable / 10000000;
  454. variable = variable %  10000000;
  455. division7 = variable / 1000000;
  456. variable = variable %  1000000;
  457. division6= variable /  100000;
  458. variable = variable %  100000;
  459. division5 = variable / 10000;
  460. variable = variable %  10000;
  461. division4 = variable / 1000;
  462. variable = variable %  1000;
  463. division3= variable /  100;
  464. variable = variable %  100;
  465. division2= variable /  10;
  466. variable = variable %  10;
  467. division1 = variable / 1;
  468. variable = variable %  1;
  469.  
  470. //Pasando a base 10.
  471. division2= division2 * 2;
  472. division1= division1* 1;
  473.  
  474. variable = (division1 + division2);
  475.  
  476. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  477. cin.get();
  478. cin.get();
  479. }
  480. if (Numero1 < 10 ) // si tiene 1 caracter
  481. {
  482. int variable;
  483. int division1;
  484. int division2;
  485. int division3;
  486. int division4;
  487. int division5;
  488. int division6;
  489. int division7;
  490. int division8;
  491. int division9;
  492. int division10;
  493.  
  494. division10 = Numero1 / 1000000000;
  495. variable = Numero1 %   1000000000;
  496. division9 = variable / 100000000;
  497. variable = variable %  100000000;
  498. division8 = variable / 10000000;
  499. variable = variable %  10000000;
  500. division7 = variable / 1000000;
  501. variable = variable %  1000000;
  502. division6= variable /  100000;
  503. variable = variable %  100000;
  504. division5 = variable / 10000;
  505. variable = variable %  10000;
  506. division4 = variable / 1000;
  507. variable = variable %  1000;
  508. division3= variable /  100;
  509. variable = variable %  100;
  510. division2= variable /  10;
  511. variable = variable %  10;
  512. division1 = variable / 1;
  513. variable = variable %  1;
  514.  
  515. //Pasando a base 10.
  516. division1= division1 * 1 ;
  517.  
  518. variable = (division1);
  519.  
  520. cout << "NUMERO CONVERTIDO EN: " << variable << endl;
  521. cin.get();
  522. cin.get();
  523. }
  524.  
  525. }
  526. else
  527. {
  528. cout << "El numero ingresado excede el maximo de caracteres permitidos.\n";
  529. }
  530.  
  531. return 0;
  532. }


FUNCIONES.H

Código
  1. class funciones
  2. {
  3. public:
  4. void PedirNumero();
  5. int ExaminarNumero(int,int);
  6. };



Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: flony en 26 Mayo 2013, 04:58 am
no soy un especialista pero se me hace que se puede hacer mas corto el code...aplicando un for y una serie para la multiplicación


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: satu en 26 Mayo 2013, 14:23 pm
Buenas!!

Acabo de hacer esta versión que acepta cualquier longitud y es mucho más corto. He probado algunos valores pero puede que tenga errores.

main.cpp
Código
  1. #include "Binario.h"
  2.  
  3.  
  4. int main() {
  5.    string numero;
  6.    double resultado = 0;
  7.    cout << "Introduce el número: ";
  8.    cin >> numero;
  9.    Binario b(numero);
  10.    resultado = b.convert();
  11.    if(resultado != -1) {
  12.        cout << "El decimal de " << numero << " es " << resultado << endl << endl;
  13.    } else {
  14.        cout << "No has introducido un valor válido" << endl << endl;
  15.    }
  16.    cin.sync();
  17.    cout << "Pulsa Enter para salir...." << endl;
  18.    cin.get();
  19.    return 0;
  20. }
  21.  


Binario.cpp
Código
  1. #include "Binario.h"
  2.  
  3.  
  4. Binario::Binario(string num) {
  5.    binario = num;
  6. }
  7.  
  8. bool Binario::isValid() {
  9.    for(unsigned i = 0; i < binario.size(); i++) {
  10.        if(binario[i] != '0' && binario[i] != '1') {
  11.            return false;
  12.        }
  13.    }
  14.    return true;
  15. }
  16.  
  17. string Binario::reverseString() {
  18.    string cad = string(binario.rbegin(), binario.rend());
  19.    return cad;
  20. }
  21.  
  22. double Binario::convert() {
  23.    double result = 0;
  24.    if(isValid()) {
  25.        string reversed = reverseString();
  26.        for(unsigned i = 0; i < reversed.size(); i++) {
  27.            if(reversed[i] == '1') {
  28.                result += pow(2, i);
  29.            }
  30.        }
  31.        return result;
  32.    }
  33.    return (-1);
  34. }
  35.  


Binario.h
Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. class Binario {
  7.  
  8. string binario;
  9.  
  10.    public:
  11.        Binario(string num);
  12.        bool isValid();
  13.        string reverseString();
  14.        double convert();
  15. };
  16.  
  17.  

Por supuesto se aceptan críticas  :P

Saludos


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: rir3760 en 26 Mayo 2013, 14:51 pm
En C y C++ se puede utilizar la función strtol para obtener el numero representado por una cadena. En C++ seria mas o menos así:
Código
  1. cout << "Numero: ";
  2. string palabra;
  3. cin >> palabra;
  4. cout << palabra << " ==> " << strtol(palabra.c_str(), 0, 2) << endl;
El tercer argumento de la función es la base (2 a 36) de la representación en cadena. Mas información sobre la mentada función en sitios como "C Plus Plus".

Un saludo


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: elkiy en 26 Mayo 2013, 15:21 pm
bueno con respecto a lo de for, es un ejercicio de un libro, donde me decia que no use for, con respecto a usar string despues no se puede dividir

S2


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: leosansan en 26 Mayo 2013, 17:21 pm
Hola amigos, bueno el titulo lo dice todo, hice un programa que puede leer un numero binario de hasta 10 caracteres y  los pasa a base 10.

Suponiendo que no vamos a hacer uso de funciones ya implementadas en C/C++ que lo harían de forma automática, no sé dónde me he perdido, pero pedazo de código para hacer eso me parece, cuanto menos, excesivo. No he pillado el por qué de hacer un proyecto con tres ficheros que te cambas. Creo que sinceramente me he perdido algo en la explicación o en el objetivo.

Porque si lo que vamos a hacer es un código que pase a decimal números en binario de no más de diez caracteres, a mí con lo que sigue me sobra, y aún así sé que es muy mejorable (por ejemplo, se podría calcular sin usar strlen la longitud de la cadena, pero estoy un poco vago hoy):


Código
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int i,n=0,longi,potencias_dos[]={1024,512,256,128,64,32,16,8,4,2,1};
  8.    char Numero[10]={0};
  9.    cout << "Escriba en numero en binario: ";
  10.    cin >> Numero;
  11.    longi=strlen (Numero);
  12.    for (i=0;i<Numero[i]!='\0';i++)
  13.        n+=(Numero[i]-'0')*potencias_dos[11-longi+i];
  14.    cout << endl<<n;
  15.    return 0;
  16. }
  17.  

Sí, ya sé que debí usar fgets, lo usaré en el próximo código.

 Y respecto a  lo comentado por satu:


Buenas!!

Acabo de hacer esta versión que acepta cualquier longitud y es mucho más corto.

lamento recordarle que no es así, pues estas limitado al número de dígitos capaz de calcular/manejar en C/C++, que anda por las quince cifras si mal no recuerdo, toda vez  que estas haciendo uso de la función ""pow" en una parte del código. Y las primeras potencias de 2 son:

Citar
0                                                                                1
  1                                                                                2
  2                                                                                4
  3                                                                                8
  4                                                                               16
  5                                                                               32
  6                                                                               64
  7                                                                              128
  8                                                                              256
  9                                                                              512
 10                                                                            1,024
 11                                                                            2,048
 12                                                                            4,096
 13                                                                            8,192
 14                                                                           16,384
 15                                                                           32,768
 16                                                                           65,536
 17                                                                          131,072
 18                                                                          262,144
 19                                                                          524,288
 20                                                                        1,048,576
 21                                                                        2,097,152
 22                                                                        4,194,304
 23                                                                        8,388,608
 24                                                                       16,777,216
 25                                                                       33,554,432
 26                                                                       67,108,864
 27                                                                      134,217,728
 28                                                                      268,435,456
 29                                                                      536,870,912
 30                                                                    1,073,741,824
 31                                                                    2,147,483,648
 32                                                                    4,294,967,296
 33                                                                    8,589,934,592
 34                                                                   17,179,869,184
 35                                                                   34,359,738,368
 36                                                                   68,719,476,736
 37                                                                  137,438,953,472
 38                                                                  274,877,906,944
 39                                                                  549,755,813,888
 40                                                                1,099,511,627,776
 41                                                                2,199,023,255,552
 42                                                                4,398,046,511,104
 43                                                                8,796,093,022,208
 44                                                               17,592,186,044,416
 45                                                               35,184,372,088,832
 46                                                               70,368,744,177,664
 47                                                              140,737,488,355,328
 48                                                              281,474,976,710,656
 49                                                              562,949,953,421,312
 50                                                            1,125,899,906,842,624
 51                                                            2,251,799,813,685,248
 52                                                            4,503,599,627,370,496
 53                                                            9,007,199,254,740,992
 54                                                           18,014,398,509,481,984
 55                                                           36,028,797,018,963,968
 56                                                           72,057,594,037,927,936
 57                                                          144,115,188,075,855,872
 58                                                          288,230,376,151,711,744
 59                                                          576,460,752,303,423,488
 60                                                        1,152,921,504,606,846,976
 61                                                        2,305,843,009,213,693,952
 62                                                        4,611,686,018,427,387,904
 63                                                        9,223,372,036,854,775,808
 64                                                       18,446,744,073,709,551,616
 65                                                       36,893,488,147,419,103,232
 66                                                       73,786,976,294,838,206,464
 67                                                      147,573,952,589,676,412,928
 68                                                      295,147,905,179,352,825,856
 69                                                      590,295,810,358,705,651,712
 70                                                    1,180,591,620,717,411,303,424
 71                                                    2,361,183,241,434,822,606,848
 72                                                    4,722,366,482,869,645,213,696
 73                                                    9,444,732,965,739,290,427,392
 74                                                   18,889,465,931,478,580,854,784
 75                                                   37,778,931,862,957,161,709,568
 76                                                   75,557,863,725,914,323,419,136
 77                                                  151,115,727,451,828,646,838,272
 78                                                  302,231,454,903,657,293,676,544
 79                                                  604,462,909,807,314,587,353,088
 80                                                1,208,925,819,614,629,174,706,176
 81                                                2,417,851,639,229,258,349,412,352
 82                                                4,835,703,278,458,516,698,824,704
 83                                                9,671,406,556,917,033,397,649,408
 84                                               19,342,813,113,834,066,795,298,816
 85                                               38,685,626,227,668,133,590,597,632
 86                                               77,371,252,455,336,267,181,195,264
 87                                              154,742,504,910,672,534,362,390,528
 88                                              309,485,009,821,345,068,724,781,056
 89                                              618,970,019,642,690,137,449,562,112
 90                                            1,237,940,039,285,380,274,899,124,224
 91                                            2,475,880,078,570,760,549,798,248,448
 92                                            4,951,760,157,141,521,099,596,496,896
 93                                            9,903,520,314,283,042,199,192,993,792
 94                                           19,807,040,628,566,084,398,385,987,584
 95                                           39,614,081,257,132,168,796,771,975,168
 96                                           79,228,162,514,264,337,593,543,950,336
 97                                          158,456,325,028,528,675,187,087,900,672
 98                                          316,912,650,057,057,350,374,175,801,344
 99                                          633,825,300,114,114,700,748,351,602,688
¡Cuidado, que te caes!

He marcado en rojo hasta dónde creo se podría calcular sin usar librerías externas,  si hacemos uso de la propia librería de números más grandes del C/C++, la inttypes

Y un código como el que plantea satu, pero recordando que el número de dígitos del número binario a introducir está limitado por lo antes expuesto, sería:


Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cinttypes>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. int  main()
  9. {
  10.    uint64_t n=0;
  11.    register int i,j,longi;
  12.    char numero[71={0};
  13.    cout <<  "Entre numero entero en base 2:\t";
  14.    fgets (numero, 20, stdin);
  15.    longi=strlen (numero);
  16.    for (j=0;j<longi-1;j++)
  17.        n+=(numero[j]-'0')*pow(2,longi-2-j);
  18.    cout <<"En decimal es "<< n;
  19.    return 0;
  20. }
  21.  

Hecho a toda pastilla y, por tanto a mejorar todavía.

Y vuelvo al comienzo, no sé dónde me perdí para que salieran esos códigos tan, como decirlo, tan complejos a simple vista.

Saluditos!. .... ..
(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: CCross en 26 Mayo 2013, 18:56 pm
leosansan me gusto el metodo que usas para pasar de binario a decimal pero no
comprendo en que consiste esta operación.

Código
  1. (numero[j]-'0')

Que hace esto exactamente ya que si multiplicas un número por cero el resultado es
cero por que no directamente pero luego me di cuenta que al quitarle eso obtengo
resultados incoherentes.

Saludos :rolleyes:



Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: leosansan en 26 Mayo 2013, 19:24 pm
leosansan me gusto el metodo que usas para pasar de binario a decimal pero no
comprendo en que consiste esta operación.

Código
  1. (numero[j]-'0')

Que hace esto exactamente ya que si multiplicas un número por cero el resultado es
cero
por que no directamente pero luego me di cuenta que al quitarle eso obtengo
resultados incoherentes.


La explicación es que numero[j] está declarado como char y para pasarlo a entero le tengo que restar su valor en ascii, que sería restarle 48 o su equivalente que es '0'. Ese es  todo el misterio que encierra esa operación, convertir un caracter ascii a int. Si lo que hubiese necesitado hubiera sido convertir el array numero, declarado como char, a int hubiese podido utilizar una función como atoi u otra de la clase string, que habría sido otra forma de haber declarado a la variable numero en lugar de char, y posiblemente más cómoda. En realidad salió el código que salió porque no me dí cuenta y lo hice en C, pero al ir a postearlo me fijé que estaba en C++ e hice una conversión "rápida", de ahí mi comentario de que es muy mejorable.

Espero haberme explicado meridianamente bien, si no es que fui torpe  ;)

Saluditos!. ... .
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: CCross en 26 Mayo 2013, 22:12 pm
Que despistado soy como no me pude dar cuenta era obvio gracias por la aclaración
mejor no pudo ser se agradece.

Saludos  ;D


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: rir3760 en 27 Mayo 2013, 15:28 pm
por ejemplo, se podría calcular sin usar strlen la longitud de la cadena, pero estoy un poco vago hoy
No es necesario multiplicar cada dígito por la potencia de 2 correspondiente, en su lugar antes de procesar cada dígito se multiplica el acumulado por la base:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. int main()
  7. {
  8.   char binario[11];
  9.   cout << "Escriba un numero en binario: ";
  10.   cin >> binario;
  11.  
  12.   int num = 0;
  13.   for (int i = 0; binario[i] != '\0'; i++)
  14.      num = num * 2 + binario[i] - '0';
  15.   cout << binario << " == " << num << endl;
  16.  
  17.   return 0;
  18. }

lamento recordarle que no es así, pues estas limitado al número de dígitos capaz de calcular/manejar en C/C++, que anda por las quince cifras si mal no recuerdo, toda vez  que estas haciendo uso de la función ""pow" en una parte del código.
Ya que no es necesario el uso de la función pow para pasar de binario a decimal la limitante es el numero de bits del acumulador, si se utiliza una variable de tipo int se tienen como mínimo 16, 32 en el caso del tipo long.

Un saludo


Título: Re: El codigo de mi programa que pasa numeros binarios a base 10
Publicado por: leosansan en 29 Mayo 2013, 12:35 pm

Ya que no es necesario el uso de la función pow para pasar de binario a decimal la limitante es el numero de bits del acumulador, si se utiliza una variable de tipo int se tienen como mínimo 16, 32 en el caso del tipo long.


Tal como indique, sólo recordaba por encima el número de dígitos capaz de manejar C/C++, que comenté estaban entre 15 y 20. Preciso, entre 10 de los enteros y enteros largos y 19 de los long long en mi ordenador, claro:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/enteroymaslimites_zps62d73953.jpg)

Que creo que  cuasi se corresponden con los 16 y 32 bits que comentabas y las correspondientes potencias de 2, toda vez que mi int y long int es de cuatro bytes, o sea 32 bits y mi long long int es de 8 bytes, es decir 64 bits.

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/tiposenteros_zps9d2a0a33.jpg)

Por cierto,calculadas  con pow y con iguales resultados que sin pow por lo que deduzco que la función implementada en C es análoga a la acumulativa expuesta por tí.



Conclusión, saquemos alguna conclusión de esta diatriba: C/C++ se queda "cortito" de manera estándar en el manejo de dígitos, muy lejos de la cantidad de dígitos que muestra la figura de mi post anterior con las potencias de 2, por cierto no calculadas con ninguna librería auxiliar o programa matemático sino con Python, aunque reconozco que no me he molestado en comprobar la bondad de dichos resultados ya que para esas cosas manejo otros programas más específicos.

Saluditos!. ... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

P.D:Sniff,Sniff   >:(  me da nostalgia al contemplar la" potencia" de programas como Matlab o Mathematica, que sin despeinarse dan, y lo pongo cortito para que no ocupe mucho:

 
Código
  1. 2^10000=
  2. 1995063116880758384883742162683585083823496831886192454852008949852943
  3. 8830221946631919961684036194597899331129423209124271556491349413781117
  4. 5937859320963239578557300467937945267652465512660598955205500869181933
  5. 1154250860846061810468550907486608962488809048989483800925394163325785
  6. 0621568309473902556912388065225096643874441046759871626985453222868538
  7. 1616943157756296407628368807607322285350916414761839563814589694638994
  8. 1084096053626782106462142733339403652556564953060314268023496940033593
  9. 4316651459297773279665775606172582031407994198179607378245683762280037
  10. 3028854872519008344645814546505579296014148339216157345881392570953797
  11. 6911927780082695773567444412306201875783632550272832378927071037380286
  12. 6393031428133241401624195671690574061419654342324638801248856147305207
  13. 4319922596117962501309928602417083408076059323201612684922884962558413
  14. 1284406153673895148711425631511108974551420331382020293164095759646475
  15. 6010405845841566072044962867016515061920631004186422275908670900574606
  16. 4178569519114560550682512504060075198422618980592371180544447880729063
  17. 9524254833922198270740447316237676084661303377870603980341319713349365
  18. 4622700563169937455508241780972810983291314403571877524768509857276937
  19. 9264332215993998768866608083688378380276432827751722736575727447841122
  20. 9438973381086160742325329197481312019760417828196569747589816453125843
  21. 4135959862784130128185406283476649088690521047580882615823961985770122
  22. 4070443305830758690393196046034049731565832086721059133009037528234155
  23. 3974539439771525745529051021231094732161075347482574077527398634829849
  24. 8340756937955646638621874569499279016572103701364433135817214311791398
  25. 2229838458473344402709641828510050729277483645505786345011008529878123
  26. 8947392869954083434615880704395911898581514577917714361969872813145948
  27. 3783202081474982171858011389071228250905826817436220577475921417653715
  28. 6877256149045829049924610286300815355833081301019876758562343435389554
  29. 0917562340084488752616264356864883351946372037729324009445624692325435
  30. 0400678027273837755376406726898636241037491410966718557050759098100246
  31. 7898801782719259533812824219540283027594084489550146766683896979968862
  32. 4163631337639390337345580140763674187771105538422573949911018646821969
  33. 6581651485130494222369947714763069155468217682876200362777257723781365
  34. 3316111968112807926694818872012986436607685516398605346022978715575179
  35. 4738524636944692308789426594821700805112032236549628816903573912136833
  36. 8393591756418733850510970271613915439590991598154654417336311656936031
  37. 1222499379699992267817323580231118626445752991357581750081998392362846
  38. 1524988108896023224436217377161808635701546848405862232979285387562348
  39. 6556440536962622018963571028812361567512543338303270029097668650568557
  40. 1575055167275188991941297113376901499161813151715440077286505731895574
  41. 5092033018530484711381831540732405331903846208403642176370391155063978
  42. 9000742853672196280903477974533320468368795868580237952218629120080742
  43. 8195513179481576244482985184615097048880272747215746881315947504097321
  44. 1508049819045580341682694978714131606321068639151168177430479259670937
  45. 6
  46.