使用字符串读入数据
定义高精度数类型
#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; }