原文为吉林大学ACM模板。
但是乘除我自己测试了几个样例好像有点问题于是自己在许多地方都改了改。
其思想依然是数组储存数位,然而每一位是万进制。这样存的数范围大了很多,但是输出输入比较麻烦。
实现了加减乘除比较和取余。除法采用二分的方法查找结果。
期中取余在除法函数里已经实现了。
#include
#include
#include
using namespace std;
const int base = 10000;//万进制所以是10000
const int width = 4; //最大是9999四位数
const int N = 1000; //最大数字是10000的1000次方
class dashu{
public:
int ln;
int v[N];
dashu(int r = 0){
int i;
for(i=0;r>0;r/=base){
v[i++]=r%base;
}
ln=i;
}
friend bool operator < (const dashu& a,const dashu& b);
friend bool operator <= (const dashu& a,const dashu& b);
friend dashu operator+ (const dashu& a,const dashu& b);
friend dashu operator- (const dashu& a,const dashu& b);
friend dashu operator* (const dashu& a,const dashu& b);
friend dashu operator/ (const dashu& a,const dashu& b);
friend void write(const dashu& v);
friend int digit(const dashu& a);
friend bool read(const dashu& b,char buf[]);
dashu& operator = (const dashu& r){
memcpy(this,&r,(r.ln+1)*sizeof(int));
return *this;
}
};
bool operator < (const dashu& a,const dashu& b){
int i;
if(a.ln!=b.ln) return a.ln=0&&a.v[i]==b.v[i];i--);
return i<0?0:a.v[i]0 && res.v[res.ln-1]==0) res.ln--;
return res;
}
dashu operator * (const dashu& a,const dashu& b){
dashu res;res.ln=0;
if(0==b.ln) { res.v[0]=0;return res;}
int i,j,cy;
for(i=0;i0;j++,cy/=base){
if(j=res.ln) res.v[res.ln++]=cy%base;
else res.v[i+j]=cy%base;
}
}
return res;
}
dashu operator /(const dashu& a,const dashu& b){
dashu mod,tem,res;
int i,lf,rg,mid;
mod.v[0]=mod.ln=0;
for(i=a.ln-1;i>=0;i--){
mod=mod*base+a.v[i];
for(lf = 0,rg=base-1;lf0&&res.v[res.ln-1]==0)
res.ln--;
for(int i=0;i>buf;
int ln=strlen(buf);
memset(&b,0,sizeof(dashu));
b.ln=ln/4+1;
int t=0;
for(int i=ln-1;i>=0;i=i-4){
int n=0;
int j=i-3;
if(j<0){
j=0;
}
while(j<=i){
n=n*10+(buf[j++]-'0');
}
b.v[t++]=n;
}
return 1;
}
void write(const dashu& v){ //输出大数
int i;
printf("%d",v.ln==0?0:v.v[v.ln-1]);
for(i=v.ln-2;i>=0;i--)
printf("%04d",v.v[i]);
cout<
至于开根号,理论上来说用牛顿递推法,但是由于是整数不太适合。手动开方的话,手动开根号的基本方法:
照此写出的函数如下,正确性存疑。
void Sqrt(char *str){
double i,r,n;
int j,l,siz,num,x[1000];
siz=strlen(str);
if(siz==1 && str[0]=='0')
{
cout<<0<=siz) break;
n=n*100+(double)(str[l]-'0')*10+(double)(str[l+1]-48);
}
for(j=0;j