linux下的bc计算器---源代码????????
本人需要进行大整数的计算,本想自己编程,碍于时间问题,请各位大虾指点,哪方有
大整数的计算(主要是+ - * /)的源代码。
偶知在linux 下bc计算器能对大数进行高速计算,谁有源码。谢谢!!!
问题点数:40、回复次数:2Top
1 楼hbcb(青蛙王子)回复于 2005-04-04 10:25:33 得分 10
用C写一段代码就可以实现了,早年我当作练习作业写过一个简单的,不知道现在还能不能找到,找到的话给你参考Top
2 楼hbcb(青蛙王子)回复于 2005-04-04 10:36:15 得分 30
比较简陋的函数,变量名命名方法不规范,你凑合着看吧
/*计算表达式,返回计算结果*/
double bc(in,ERR)
char *in; /*输入值,算术表达式*/
char *ERR; /*返回信息,计算正确=空;若有错误=具体错误消息*/
{
char *s,t[256],cp[256],ep[256],e;
int i,j,k,p,q,c,xs,err;
double np[256],a,w,f;
err=0;*ERR='\0';
strcpy(t,in);s=t;
i=0;while((e=*(s+i++))!='\0')if(e=='(' && *(s+i)=='-')*(s+i)=':';
c=0;i=q=0;np[1]=0.0;
cp[0]='@'; /*置栈底标志@*/
/*====扫描表达式,压入栈中====*/
while(err==0 && *s!='\0'){
if(*s=='-' && (q==0 || *(s-1)=='('))*s=':';
e=*(s+1);
switch(*s){
case '(':
if((e<'0'||e>':') && e!='-' && e!='(')err=1;
else cp[++c]=*s;
break;
case ')':
if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!=')'&&e!='\0')err=1;
else {
while(cp[c]!='(')ep[i++]=cp[c--];
c--;
if(c<0)err=1;
};
break;
case '+':case '-':
if((e<'0'||e>':') && e!='(')err=1;
else {
while((e=cp[c])=='+'||e=='-'||e=='*'||e=='/')ep[i++]=cp[c--];
cp[++c]=*s;
};
break;
case '*':case '/':
if((e<'0'||e>':') && e!='(')err=1;
else {
while((e=cp[c])=='*' || e=='/')ep[i++]=cp[c--];
cp[++c]=*s;
};
break;
case '^':
if((e<'0'||e>':') && e!='(')err=1;
else {
while(cp[c]=='^')ep[i++]=cp[c--];
cp[++c]=*s;
};
break;
case '.':
if((e<'0'||e>':')&&e!='+'&&e!='-'&&e!='*'&&e!='/'&&
e!='^'&&e!=')'&&e!='%'&&e!='\0')err=1;
else {
ep[i++]=*s;
if(e<'0'||e>':')ep[i++]='#';
};
break;
case '%': /*===百分号===*/
if(e!='+'&&e!='-'&&e!='*'&&e!='/'&&e!='^'&&e!=')'&&e!='\0')err=1;
else {
ep[i++]=*s;
ep[i++]='#';
};
break;
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8':case '9': case ':': /*===数字符号===*/
if((e<'0'||e>':') && e!='+'&&e!='-'&&e!='*'&&e!='/'&&
e!='^'&&e!=')'&&e!='%'&&e!='.'&&e!='\0')err=1;
else {
ep[i++]=*s;
if((e<'0'||e>':') && e!='%' && e!='.')ep[i++]='#';
};
break;
default: /*===非数字符号===*/
err=1;
};
s++;q++;
};
if(err==1){sprintf(ERR,"表达式错误");return;};
if(ep[i-1]!='#')ep[i++]='#'; /*==置数据项结束标志#====*/
/*====出栈,计算值====*/
while(cp[c]!='@')ep[i++]=cp[c--];
ep[i]='\0';
i=j=0;f=1.0;
while((e=ep[i++])!='\0'){
switch(e){
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8':case '9':case '.':case '%':case ':':
a=0.0;xs=0;w=1.0;
if(e==':'){f=(-1.0);e=ep[i++];};
while(e!='#'){
switch(e){
case '.': xs=1;break;
case '%': a/=100;e='#';break;
case ':': break;
default: if(xs==0)a*=10;else w/=10;
a+=(e-'0')*w;
};
e=ep[i++];
};
np[++j]=a*f;f=1.0;
break;
case '+':np[--j]+=np[j+1];break;
case '-':np[--j]-=np[j+1];break;
case '*':np[--j]*=np[j+1];break;
case '/':
if(np[j]==0.0){sprintf(ERR,"除数为0");return;};
np[--j]/=np[j+1];break;
case '^': /*只能是整数次乘方*/
k=(int )np[j--];
a=np[j];np[j]=1.0;
if(k>0)for(p=0;p<k;p++)np[j]*=a;
else if(k<0)for(p=0;p>k;p--)np[j]/=a;
break;
};
};
return(np[1]);
}
Top




