除法可保留小数无限位.
/**/
#include
#include
#include
#include
int cchkdig(char *r)
{
int i=0;
while(r[i]!='\0')
{
if(isdigit(r[i++])==0)
return (0);
}
return (1);
}
//去掉整数串表示前面多余的零,最后结果为空串时置为"0"
void cdel0(char *r)
{
unsigned int lr;
int i=0, j;
lr=strlen(r);
while(r[i]=='0')
++i;
if(i>0)
{
for(j=0; j
r[j]=r[j+i];
for(j=lr-i; j
{
r[j]='\0';
}
}
if(r[0]=='\0')
{
r[0]='0';
}
}
int scmp(char *r, char *u)
{
unsigned int lr, lu;
cdel0(r);
cdel0(u);
lr=strlen(r);
lu=strlen(u);
if(lr>lu)
{
return 1;
}
else if (lr
{
return -1;
}
return (strcmp(r, u));
}//end scmp()
//两个串表示数的减法
char *ssub(char *r, char *u)
{
unsigned int i,lr, lu, lp,c=0;
char h,hc;
char *p;
if(scmp(r, u)<0)
return NULL;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
for(i=0; i
{
h=r[lr-i-1]-u[lu-i-1]-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]=h+'0';
hc=h+'0';
}
for (i=lu; i
{
h=r[lr-i-1]-'0'-c;
if(h<0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]='0'+h;
hc='0'+h;
}
p[i]='\0';
lp=i-1;
while(p[lp]=='0'&&lp!=0)
{
p[lp]='\0';
lp--;
}
for(i=0; i
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end ssub()
/*
//两个串表示数的加法
char *sadd(char *r, char *u)
{
unsigned int lr, lu, lp;
int i, h, c=0;
char hc, *p;
lr=strlen(r);
lu=strlen(u);
if(lu>lr)
{
p=r;
r=u;
u=p;
h=lr;
lr=lu;
lu=h;
}
p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));
for(i=0; i
{
h=r[lr-i-1]-'0'+u[lu-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]=h+'0';
}
for(i=lu; i
{
h=r[lr-i-1]-'0'+c;
if(h>9)
{
c=1;
h=h-10;
}
else
c=0;
p[i]='0'+h;
}
if(c>0)
{
p[i]=c+'0';
lp=i;
}
else
lp=i-1;
for(i=lp+1; i
p[i]='\0';
for(i=0; i