高精度数加減演算
3244 ワード
文字列を使用してデータを読み込む
高精度数タイプの定義
高精度数タイプの定義
#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;
}