使用字符串读入数据
定义高精度数类型
#define MAXLEN 3000
typedef struct
{
int sign; //0正 1负
int ni; //整数长度
int a[MAXLEN];//整数数字
int nd; //小数长度
int d[MAXLEN];//小数数字
}BIGFLOAT;
void assign(int sign, char s[], BIGFLOAT *x)
{
int i,ip,m,c;
for(i=0;i<MAXLEN;i++) x->a[i]=0;
for(i=0;i<MAXLEN;i++) x->d[i]=0;
x->sign = sign;
m = strlen(s);
ip = m;
for(i=0;i<m;i++)
{
if(s[i]=='.') ip=i;
}
for(i=ip-1;i>=0;i--)
{
c=s[i]-'0';
if(c>=0&&c<=9)
x->a[ip-1-i]=c;
}
for(i=ip+1;i<m;i++)
{
c=s[i]-'0';
if(c>=0&&c<=9)
x->d[x->nd-(i-ip)]=c;
}
}
void add(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)
{
int i,s,carry=0;
c->ni = a.ni; //
c->nd = a.nd; //
for(i=0;i<c->nd;i++)
{
s=carry+a.d[i]+b.d[i];
c->d[i]=s%10;
carry=s/10;
}
//进行整数部分的加法计算
for(i=0;i<c->ni;i++)
{
s=carry+a.a[i]+b.a[i]; //本位加上进位
c->a[i] = s%10; //计算整数部分本位数字
carry = s/10; //计算进位
}
}
void sub(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c)
{
int i;
c->ni=a.ni;
c->nd=a.nd;
//进行小数部分的减法计算
for(i=0;i<c->nd;i++)
{
if(b.d[i]>a.d[i]) //判断减数是否大于被减数
{
if(i+1==c->nd) a.a[0] -=1; //向整数部分 借位
else a.d[i+1] -=1; //向高位借位
a.d[i] +=10; //借位后,本位加上进位基数
}
c->d[i]=a.d[i]-b.d[i]; //同位数字相减
}
//进行整数部分的减法计算
for(i=0;i<c->ni;i++)
{
if(b.a[i]>a.a[i])
{
a.a[i+1]-=1;
a.a[i]+=10;
}
c->a[i]=a.a[i]-b.a[i];
}
}
void sum(BIGFLOAT a,BIGFLOAT b,BIGFLOAT *c) //高精度加法和减法混合计算函数
{
int sign;
if(a.sign == b.sign)
{
c->sign = a.sign;
add(a,b,c);
}
else
{
sign = compare(a,b); //1负,0正
if(sign==0) //a 的绝对值大于b的绝对值
{
c->sign=a.sign; //和的变量符号与绝对值的相同
sub(a,b,c); //绝对值大的数减去小的数
}
else
{
c->sign = b.sign; //和的变量符号与绝对值的相同
sub(b,a,c); //绝对值大的数减去小的数
}
}
}
//比较两个浮点数绝对值的大小
int compare(BIGFLOAT a, BIGFLOAT b)
{
int i;
for(i=a.ni-1;i>=0;i--)
{
if(b.a[i]>a.a[i]) return 1; //后者大于前者
if(b.a[i]<a.a[i]) return 0;
}
for(i=a.nd-1;i>=0;i--) //若整数部分相等,则比较小数部分
if(b.d[i]>a.d[i]) return 1;
return 0;
}