La Red de Conocimientos Pedagógicos - Currículum vitae - Cómo implementar cálculos de números grandes en lenguaje C

Cómo implementar cálculos de números grandes en lenguaje C

/*Acerca de la exponenciación de alta precisión de números grandes con precisión arbitraria

Vi un algoritmo introducido en un artículo anterior, que utiliza el método base 10000 y utiliza una matriz para almacenarlo. . datos.

El principio es el siguiente:

Hablemos primero del método de conteo:

Los sistemas decimales y otros sistemas básicos usan pesos y números (parece que la terminología aquí está mal, no lo recuerdo claramente) ) para contar:

Por ejemplo

num=123456790

El tamaño de este número es:

0*10^0 9 *10^1 7*10^2 ... 1*10^8

Podemos escribir este número así:

123 456 790

Sea a=123, b=456, c=790

Entonces, abc se ve igual que 123456790

¿Entiendes cuando ves esto?

Podemos representar un número muy grande en segmentos sin considerar su desbordamiento

Solo debemos considerar si el número de segmentos es mayor que un número

Por ejemplo:

p>

Arriba, el valor máximo de a es 999, y lo mismo ocurre con bc. Solo debemos asegurarnos de que estos tres números no se desborden.

Entonces, num no se desbordará

Otra multiplicación

El ábaco que nos dejaron nuestros antepasados ​​es maravilloso.

En realidad es uno de. las computadoras más básicas

Calculamos Al exponenciar,

Solo multiplicamos por un número:

Formulamos la fórmula así:

123456790

*2=

--------------

246913580

Es decir:

123 456 790

*2= *2= *2=

----- ----- ------

246 912 (1)580( Overflow) El tercer párrafo tiene desbordamiento, agréguelo al párrafo anterior

----- ----- ------- -

246 913 580

Jaja, eso es todo, igual que el ábaco, llevando

En este punto, hemos resuelto los problemas de cálculo de desbordamiento y exponenciación. eso hay que calcularlo, y sólo tenemos que mirar el código:

El programa utiliza una matriz que contiene 1024 enteros sin signo (el límite superior es 65536) para almacenar cada segmento de datos

Cada número es un segmento, y cada dato puede representar un número tan grande como 9999 (conveniente para llevar)

Calcule una vez y verifique si excede 9999. Si excede, reste 10000 de este período.

Luego suma 1 al dígito anterior (es decir, al número anterior) (esto se puede llamar "base de diez mil")

El programa puede calcular cualquier potencia de dos menos mayor que 2 elevado a la potencia de 13605 y mayor que 0 potencia

De hecho, no es necesario calcular de esta manera, pero, me parece divertido y ameno.

Además. , con la ayuda de logaritmos, puedes calcularlos fácilmente.

Por el contrario, este programa no tiene errores

A este algoritmo lo llamo "método del ábaco '10,000 base'":

p>

*/

#include "stdio.h "

int main(void) <

/p>

{

static unsigned int temp[1024]; /*Almacenamiento segmentado de datos*/

unsigned int position=1 /*Registro*** Sí Varios segmentos*/

int overflow=0; /*Registra si hay desbordamiento al calcular cada segmento*/

long

times=10000, tm_cnt, sgn_cnt ;/*10000 cálculos predeterminados, se pueden cambiar, dos contadores (número de exponenciaciones, posición de segmentos)*/

temp[0]=2; /*El valor inicial es 2*/

if(timesgt; 13000)

{

printf( "su entrada es demasiado grande "); /*Compruebe si la entrada está fuera de los límites*/

exit(0);

}

/*Inicia el cálculo, la capa exterior es el número de potencias y la capa interior se calcula para cada dígito*/

for (tm_cnt=0; tm_cnt lt; times-1; tm_cnt )

{

for(sgn_cnt=0; sgn_cnt lt; posición; sgn_cnt )

{

temp[sgn_cnt] lt; lt;=1; /*Equivalente a multiplicar por 2*/

if(overflow==1) / *Compruebe si hubo un desbordamiento la última vez*/

{

/*Si lo hay, agregue un desbordamiento a esta sección y establezca el desbordamiento en 0*/

temp[sgn_cnt];

overflow=0;

}

if(temp[sgn_cnt]gt; 9999)

{

/* Compruebe si hay desbordamiento esta vez. Si es así, */

temp[sgn_cnt]-=10000

overflow=1; /p>

}

}

if(overflow==1)

{

posición

temp[sgn_cnt];

overflow=0

}

if(positiongt; 1023)

{ <

p> printf( "veces: d error! ", tm_cnt)

exit(1); printf( "d ", temp[sgn_cnt-1]);

for(sgn_cnt=position-2; sgn_cntgt; =0; sgn_cnt--)

{

if(temp[sgn_cnt] lt; 1000)

printf( "0 "

if(temp[sgn_cnt] lt; 100)

printf( "0 ");

if(temp[sgn_cnt] lt; 10)

printf( "0 "); ", temp[sgn_cnt]);

if((sgn_cnt 1)15==0)

printf( "\n ");

}

retorna 0;

}

2 elevado a la potencia 1000:

199 5063 1168 8075

8384 8837 4216 2683 5850 8382 3496 8318 8619 2454 8520 0894 9852 9438 8302

2194 6631 9199 6168 4036 1945 9789 9331 1294 20 9 124 2715 5649 1349 4137

8111 7593 7859 3209 6323 9578 5573 0046 7937 9452 6765 2465 5126 6059 8955

2055 0086 9181 9331 1542 5086 0846 0618 1046 8550 9074 8660 8962 4888 04

8989 4838 0092 5394 1633 2578 5062 1568 3094 7390 2556 9123 8806 5225 0966

4387 4441 0467 5987 1626 9854 5322 2868 5381 6169 4315 7756 2964 0762 8368

8076 0732 2285 3509 41

4761 8395 6381 4589 6946 3899 4108 4096 0536 2678

2106 4621 4273 3339 4036 5255 6564 9530 6031 4268 0234 9694 0033 5 934 3166

5145 9297 7732 7966 5775 6061 7258 2031 4079 9419 8179 6073 7824 5683 7622

8003 7302 8854 8725 1900 8344 6458 1454 6505 5792 9601 4148 3392 1615 7345

8813 9257 53 7976 9119 2778 0082 6957 7356 7444 4123 0620 1875 7836 3255 < / p>

0272 8323 7892 7071 0373 8028 6639 3031 4281 3324 1401 6241 9567 1690 5740

6141 9654 3423 2463 8801 2488 5614 73 05 2074 3199 2259 6117 9625 0130 9928

6024 17083408076059323201612684922884962558413128440615367389 293 1640 9575 9646 4756 0104

0584 5841 5660 7204 4962 670 1651 5061 9206 3100 4186 4222 7590 8670 9005

7460 6417 8569 5191 1456 0550 6825 1250 4060 0751 9842 2618 9805 9237 1180

5444 4788 0729 0639 5242 5483 3922 1982 7074 0447 3162 3767 6084 6613 0337

7870 6039 8034 1319 33 4936 5462 2700 5631 6993 7455 5082 4178

0972 8109

8329 1314 4035 7187 7524 7685 0985 7276 9379 2643 3221 5993 9987 6886 6608

0836 8837 8380 2764 3282 77 51 7227 3657 5727 4478 4112 2943 8973 3810 8616

0742 3253 2919 7481 3120 1976 0417 8281 9656 9747 5898 1645 3125 8434 1359

5986 2784 1301 2818 5406 2834 7664 9088 6905 2104 7580 8826 1582 3961 9857

7012 2407 0443 3058 3075 8690 3931 9604 6034 0497 3156 5832 0867 2105 9133

0090 3752 8234 1553 9745 3943 9771 5257 4552 9051 0212 3 109 4732 1610 7534

7482 5740 7752 7398 6348 2984 9834 0756 9379 5564 6638 6218 7456 9499 2790

1657 2103 7013 6443 3135 8172 1431 1791 3982 2298 3845 8473 3444 0270 9641

82 85 1005 0729 2774 8364 5505 7863 4501 1008 5298 7812 3894 7392 8699 5408

3434 6158 8070 4395 9118 9858 1514 5779 1771 4361 9698 7281 3145 9483 7832

0208 1474 9821 7185 8011 3890 22 8250 9058 2681 7436 2205 7747 5921 4176

5371 5687 7256 1490 4582 9049 9246 1028 6300 8153 5583 3081 3010 1987 6758

5623 4343 5389 5540 9175

6234 0084 4887 5261 6264 3568 6488 3351 9463 7203

7729 3240 0944 5624 6923 2543 5040 0678 0272 7383 7755 3764 0672 6 898 6362

4103 7491 4109 6671 8557 0507 5909 8100 2467 8988 0178 2719 2595 3381 2824

2195 4028 3027 5940 8448 9550 1467 6668 3896 9799 6886 2416 3631 3376 3939

0337 80 14 0763 6741 8777 1105 5384 2257 3949 9110 1864 6821 9696 5816 < / p>

5148 5130 4942 2236 9947 7147 6306 9155 4682 1768 2876 2003 6277 7257 7237

8136 5331 6111 9681 1280 7926 6948 18 87 2012 9864 3660 7685 5163 9860 5346

0229 7871 5575 1794 7385 2463 6944 6923 0878 9426 5948 2170 0805 1120 3223

6549 6288 1690 3573 9121 3683 3839 3591 64 1 873 3850 5109 7027 1613 9154

3959 0991 5981 5465 4417 3363 1165 6936 0311 2224 9937 9699 9922 6781 7323

5802 3111 8626 4457 5299 1357 5817 5008 1998 3923 6284 6152 88 1088 9602

3224 4362 1737 7161 8086 3570 1546 8484 0586 2232 9792 8538 7562 3486 5564

4053 6962 6220 1896 3571 0288 1236 1567 5125 4333 8303 2700 2909

7668 6505

6855 7157 5055 1672 7518 8991 9412 9711 3376 9014 9916 1813 1517 1544 0077

2865 0573 1895 5745 0920 33 01 8530 4847 1138 1831 5407 3240 5331 9038 4620

8403 6421 7637 0391 1550 6397 8900 0742 8536 7219 6280 9034 7797 4533 3204

6836 8795 8685 8023 7952 2186 2912 0080 7428 1955 1317 9481 5762 4448 2985

1846 1509 7048 8802 7274 7215 7468 8131 5947 5040 9732 1150 8049 8190 4558

0341 6826 9497 8714 1316 0632 1068 6391 5116 8177 4304 7 925 9670 9376