大数的指数运算

大数是按“节”分装的数据类型。一个“节”可以存放4位数字,或8位数字,因此可以按“节”看作是10000进制或100000000进制。这显然是为了显示转化方便而设计的。实际可以是任何进制。

这里假设一个“节”存放4位数字,所以是万进制。每个“节”存放的数据范围是0~9999。

a[]= {1, 2345, 6789, -1};
x=0;
for(i=0; a[i]>=0; i++) {
        x*= 10000;
        x+= a[i];
}
print x;
1 2345 6789

大数的指数运算也是按“节”拆分,然后再链接起来。每一个“节”之内的计算跟普通的整数指数运算没有什么两样:

func pexp(a, p)
{
	cmp[]= {1, 2, 4, 8, 16, 32, 64, 128, 256,
		512, 1024, 2048, 4096, 8192 };

	if(p==0) return 1;
	i=13;
	while( p <cmp[i] ) --i;
	e= a;
	p-= cmp[i];
	--i;
	while(i>=0) {
		e*=e;
		if( p>=cmp[i] ) {
			e*=a;
			p-=cmp[i];
		}
		--i;
	}
	return e;
}

当然,这里做了乘法优化,而不是原始的最多进行9999次连乘的算法。

当跨计算“节”时, 要对“节”进行调整。

func uexp(a)
{
	e=a;
	e*=e;
	e*=e;
	e*=e;
	e*=a;
	e*=e;
	e*=a;
	e*=e;
	e*=a;
	e*=e;
	e*=e;
	e*=e;
	e*=e;
	e*=a;
	e*=e;
	e*=e;
	e*=e;
	e*=e;
	return e;
}

uexp(a)实际上= pexp(a, 10000)。因为指数是常数的原因,对pexp中的循环和条件做了优化。

最后, 把每一“节”的结果连起来。注意参数z的第一个值是1,以后是前面计算的部分结果:

func zexp(z, a, p)
{
	return uexp(z) *pexp(a, p);
}

举个例子来说,比如,要计算123456789的123456789次方,可以这样算:

a=123456789;
z=1;
z=zexp(z, a, 1);
z=zexp(z, a, 2345);
z=zexp(z, a, 6789);
print z;

“这里只不过讨论算法而已。”
因为123456789的123456789次方是个很大的数,大约有50亿个数位,限于计算机的存储能力,也限于计算机的运算速度,实际演示不了。所以就演示个小一点数据意思一下吧!下面就计算2的12345次方。因为log10(2)大约=0.3…。这个数有3000多个数位。

a=2;
p[]= {1, 2345, -1};
z=1;
for(i=0; p[i]>=0; i++) {
	z=zexp(z, a, p[i]);
}
print z;

计算得到结果是:

1 6417 1010 6882 5821 6356 0207 4166 3906 5014 1012 7235 5307 3588 1272 1161 030
8 7925 0941 7139 0144 2801 5903 4536 4394 5773 4870 4191 2714 0401 6671 9551 033
1 0856 5718 5332 7210 8923 6401 1930 4449 3457 1162 9976 8844 3443 0347 9235 489
4 6243 6380 6721 1701 5123 2832 9913 1391 9041 7928 7678 2591 7330 8536 7387 619
8 1139 9586 5488 0852 2349 0844 8338 8172 8901 4166 7741 6986 9251 3393 7982 859
9 7484 9291 8775 4378 6473 9032 2177 7805 1333 8829 9007 4116 2462 8126 9364 933
7 2489 2342 1345 0470 2491 0400 1663 7557 4298 1089 3780 7651 9741 8589 4775 847
1 6543 4809 9572 2533 3178 6235 2141 4592 1778 1316 2662 1118 6486 1570 1926 208
0 4140 7767 0264 6427 3601 8426 9981 1352 3445 7326 8085 6144 3298 7697 2273 300
7 0339 2584 9977 2920 7197 9710 8394 5700 3454 9409 2400 1471 8699 7307 0120 694
5 4068 4895 8903 5676 9794 4816 9848 0608 3692 4945 8241 9770 6493 3061 0825 851
1 9360 3034 1393 2215 8642 3523 2644 5244 9403 7819 9335 2421 8850 9466 4052 270
7 9552 7632 7218 9612 1424 8131 7352 2474 6743 9588 6155 0922 0340 4036 7307 484
7 4781 7107 1574 5446 1354 6809 8139 8318 2408 3259 6479 1917 5273 5036 8156 117
2 6846 2428 3384 4385 0477 6503 0004 3224 1604 5504 5437 4116 3208 2222 7191 911
3 2212 3484 0850 6392 6350 6063 4219 7146 4078 4117 8028 0711 4719 2533 9425 172
7 0553 5139 8814 2925 9760 9076 9695 4562 2115 9699 0525 8353 3011 3316 5207 934
7 0930 9817 3086 9754 8353 9274 4640 2335 7456 4844 6548 2927 4795 6943 7320 368
5 9222 2760 2781 7030 6076 7334 3880 1098 3707 9767 5711 2746 7105 4970 7114 421
5 8930 5616 8434 3135 7741 1874 1594 5067 0283 3147 3967 5882 5015 8500 4298 334
3 6903 4518 5995 9562 3514 3825 7716 2054 3546 0306 6456 2647 8546 5643 1302 644
5 7411 9873 8202 1559 5718 6186 2448 5232 4220 0657 5550 0070 6888 3734 2414 546
8 6368 8567 3449 6265 3859 0880 9403 9724 9468 5137 7411 2286 6896 7196 7805 393
7 2858 1840 9751 6703 2014 0501 8430 3922 4040 7358 7009 6889 5962 7341 9106 389
1 0366 2095 3189 3799 0625 9801 3671 1988 2374 2196 2315 2666 8685 6089 5059 814
3 8440 8506 3806 7589 3211 4175 9499 0170 2383 9596 8584 5554 8192 0001 4008 514
2 2941 6698 7063 4990 2479 2681 3348 4315 9790 9363 2135 1919 8597 5866 9569 200
5 4150 7612 0997 8090 9705 1989 0217 6026 2198 7220 1715 4220 9609 0343 6862 729
8 4351 4415 9456 9506 7780 4106 2663 2667 9934 2793 8563 1380 1540 9598 1584 578
8 5847 5903 3248 8282 4856 1586 4502 7117 2777 2409 7179 5656 0820 0184 8115 815
2 6093 0521 6631 6748 0173 8860 6401 9118 5727 7828 1516 7351 5777 9555 8881 677
8 7064 4325 5859 5410 8439 8744 6497 8816 6628 8423 2331 7006 0413 0259 2462 995
0 4773 0334 2180 1493 9892 6073 6185 8271 5358 7422 5038 8958 2312 8169 4757 980
5 2379 1263 6994 5073 2952 3257 2766 4209 9477 8606 3982 5617 7532 7638 5045 169
1 8570 1013 1939 1698 4123 8860 7603 7424 8441 4748 2683 8966 9129 1180 2687 896
9 7357 8228 6841 1168 4265 6410 5746 4760 7524 4189 0072 0328 0453 7799 3386 279
8 0876 8990 3762 8942 4757 3510 5236 9393 9771 3787 1998 1191 6889 8493 0379 387
5 6635 6215 5762 3138 4044 5926 6598 8377 8422 9325 7998 3878 2026 0604 8149 686
5 5617 5703 1839 0022 5709 1802 8769 4924 8392 7441 7566 9112 2420 8843 9883 248
3 3631 0597 0012 5738 5980 7769 6152 9351 1988 7774 7193 5310 5495 6881 8083 321
7 7946 7514 0403 8228 7185 6791 1769 6309 7155 3915 4100 1267 7600 0024 5798 220
7 4651 7667 0752 1021 1700 2773 9805 4808 9696 5309 7247 6439 6945 9988 1281 812
9 7321 7265 8538 8472 7906 5354 7974 5854 0853 3885 1105 1445 8548 1994 1562 064
9 7436 7458 9994 4877 7325 3141 2541 2790 1430 0324 5948 9062 3941 1455 0985 694
0 9828 6376 9834 4300 4812 0562 9667 9790 7114 1026 8987 9364 9456 8986 0493 474
9 5453 8422 3677 1950 7882 5131 6605 1007 3529 9406 8319 2514 5066 6676 6483 682
0 0564 3293 8299 8758 8757 6041 4259 6540 0497 7261 3099 8826 7319 8063 5485 605
1 7845 5399 0936 6106 3473 3375 9841 5902 8722 3786 1498 4450 2553 8631 5585 631
9 9450 3350 0021 4291 0493 1902 5482 5610 7074 0058 9976 3649 8574 8467 9551 310
7 7971 6418 8267 2895 8545 7123 6368 2828 1133 6220 7691 7478 4720 1133 3126 908
4 7465 2420 4124 2634 7505 4112 8416 3093 3586 1661 9503 6115 6964 6968 6075 600
4 8042 0563 5575 6761 6835 6332 5262 2327 1728 1100 2146 3927 5444 5051 1821 698
0 5284 6302 5970 3542 6339 5512 6179 5201 1305 9629 9142 2983 3688 5359 2572 967
6 7780 2840 6897 3161 0610 1038 4691 1909 0984 5671 5259 1962 3654 1503 9646 394
5 9150 3830 7976 2633 9246 9860 5707 7758 6114 1366 4914 1687 4537 5266 7862 981
4 1171 4965 7394 1614 3877 4412 5843 6856 7706 3619 7829 1875 9823 1060 2105 403
7 7578 5776 1587 4722 4083 5040 5804 4736 0544 0290 6493 0412 5699 4316 9729 238
1 0216 2312 2186 8793 0203 0680 5540 0275 7951 8097 2382 8566 9665 5279 4082 123
4 4832

相关推荐

  1. 指数运算

    2024-04-25 13:16:02       33 阅读
  2. 指针运算

    2024-04-25 13:16:02       44 阅读
  3. C 指向指针

    2024-04-25 13:16:02       37 阅读
  4. C 指针算术运算

    2024-04-25 13:16:02       43 阅读
  5. C语言指针数组 指针运算

    2024-04-25 13:16:02       71 阅读
  6. 矩阵运算创建

    2024-04-25 13:16:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 13:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 13:16:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 13:16:02       82 阅读
  4. Python语言-面向对象

    2024-04-25 13:16:02       91 阅读

热门阅读

  1. 设备驱动-随记

    2024-04-25 13:16:02       29 阅读
  2. 电力电子技术——整流电路详解

    2024-04-25 13:16:02       31 阅读
  3. 在Visual Studio Code中配置C++编译器的一般步骤

    2024-04-25 13:16:02       40 阅读
  4. flutter 设置全屏 和隐藏状态栏和导航栏

    2024-04-25 13:16:02       38 阅读
  5. 2024-04-24 游戏开发-区块链游戏-记录

    2024-04-25 13:16:02       37 阅读
  6. go垃圾回收机制

    2024-04-25 13:16:02       34 阅读