作业帮 > 综合 > 作业

C语言中如何实现大数计算

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/28 00:11:31
C语言中如何实现大数计算
我想用C语言求出2的80次幂,结果用浮点数或整数输出,怎么做.
/*关于任意精度大数的高精度求幂运算
在以前的文章中看到介绍一种算法,就是使用10000进制法,用数组来存储数据.
原理如下:
先说计数方法:
十进制和其他进制都是用权和数字(好象这里名词不对,记不清楚了)来计数的:
比如
num=123456790
这个数的大小就是:
0*10^0+9*10^1+7*10^2+...+1*10^8
我们可以这样来写这个数:
123 456 790
令a=123,b=456,c=790
那么,abc看起来就象和123456790是一样的
看到这里你明白了吧?
我们可以分段表示一个非常大的数而不必考虑它的溢出,
而只用考虑段数是否大于一个数即可
举个例子:
上边,a的最大值是999,bc也同样都是,我们只用保证这三个数不溢出
那么,num就不会溢出
再一个乘法.
我们老祖宗给我们留下的算盘,很妙,
它其实就是最基本的计算机之一
我们算乘方时,
只用乘以一个数:
这样来列式子:
123456790
*2=
--------------
246913580
即:
123 456 790
*2= *2= *2=
----- ----- ------
246 912 (1)580(溢出) 第三段有溢出,加到上一段
----- ----- --------
246 913 580
就这样,打算盘一样,进位.
至此,我们已经将需要计算的溢出和乘方计算问题解决了,只用看代码了:
程序用一个含有1024个无符号整数(上限65536)的数组来存放各段数据
每一个数是一段,每一个数据可以表示9999这么大的数(便于进位)
计算一次,检查是否超过9999,如果超过,把这一段减去10000,
然后向上一个位(即上一个数)进1(这可以称为 "一万进制 ")
程序可以计算小于2的13605次方,大于0次方的任意的二的乘方
其实这样算起来一点也没有必要,不过,我觉得好玩,过瘾.
另外,借助对数,可以很轻松的算出这些来,
相比之下,本程序无任何误差而已
我称这个算法为 " '一万进制 '算盘法 ":
*/
#include "stdio.h "
int main(void)
{
static unsigned int temp[1024];/*分段储存数据*/
unsigned int position=1;/*记录共有几段*/
int overflow=0; /*记录在算每一段时是否溢出*/
long
times=10000,tm_cnt,sgn_cnt;/*默认10000次计算,可以更改,两个计数器(乘方次数,段的位置)*/
temp[0]=2;/*初始值为2*/
if(times> 13000)
{
printf( "your input is too large ");/*检查输入是否越界*/
exit(0);
}
/*开始计算,外层为乘方次数,内层为每一位计算*/
for(tm_cnt=0;tm_cnt =0;sgn_cnt--)
{
if(temp[sgn_cnt]