采用C语言 :用字符数组的方法实现超高位数的加减法 ,最好能把乘除也实现了

2025-02-23 05:02:19
推荐回答(1个)
回答1:

我有一个计算大数阶乘的代码,BCB6写的,可以精确到100万位,里面涉及加、乘,有注释,供参考。void __fastcall TForm1::btn1Click(TObject *Sender)
{
//由于使用了很大数组,内存消耗特大,静态数组直接占用栈空间,请在IDE中将Max stack size设为最大0x01000000
//也可以采用动态数组
char ValBuf[1024000+2];//存放结果值,1位数占一个字节,且颠倒存放,第1位为个位,第2位为十位...,这样便于向后进位
char TmpBuf[1024000+2]; //存放中间结果
register char *p1,*p2,*p3,*pStart,*pEnd;
int n=edt1->Text.ToIntDef(10);
TTime t=Now();
memset(ValBuf,0,sizeof(ValBuf));
ValBuf[0]='1';//乘数先置1
AnsiString nstr;
register i,j,k,m;
Tag=0;
mmo2->Visible=False;
while(n>1){
nstr=IntToStr(n--);
pStart=nstr.c_str();
pEnd=pStart+nstr.Length()-1;
p1=pEnd ;
memset(TmpBuf,0,sizeof(TmpBuf));
m=0;
stat1->SimpleText="请按ESC中断..."+nstr;
while(p1>=pStart){//被乘数从末位开始乘
//因计算量太大,本循环体内应考虑用户中断
Application->ProcessMessages();
if(Tag){//用户中断标志
n=1;
stat1->SimpleText="用户中断于"+nstr;
break;
}
i=*p1-'0';
p2=ValBuf;
p3=TmpBuf+m++;
k=0;
while(*p2){
j=*p2-'0';//字符还原成数值
j*=i;//乘
j+=k;//加上进位数
if(*p3)j+=*p3-'0';//加上本位数
*p3=j%10+'0';//数值转存为字符
k=j/10; //进位值 p2++;
p3++;
}
if(k){//进位
if(p3>=TmpBuf+sizeof(TmpBuf)-2){
throw Exception("数据溢出!");
}
if(*p3)k+=*p3-'0';
*p3++=k%10+'0';
if(k>10)*p3=k+'0';
}
p1--;
}
memcpy(ValBuf,TmpBuf,p3-TmpBuf);//将中间结果复制到乘数
}
if(!Tag){//将结果值颠倒输出
p1=ValBuf;
p2=TmpBuf+sizeof(TmpBuf)-2;
register int count=0,Zero=0,NotZero=0;
while(*p1){
count++;
if(*p1=='0'&&!NotZero)Zero++;else NotZero=1;
*p2--=*p1++;
}
mmo1->Lines->Text=p2+1;
t=Now()-t;
stat1->SimpleText="计算完毕,共"+IntToStr(count)+"位,末尾共有"+IntToStr(Zero)+"个0,用时"+t.TimeString();
ShowMessage(stat1->SimpleText);
}
}
//---------------------------------------------------------------------------void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if(Key==27)
Tag=1;//用户中断标志
}