大数加减乘除取余
发布时间:2020-12-14 04:12:28 所属栏目:大数据 来源:网络整理
导读:除了除法取模两个函数,每个运算函数不依赖其它函数; 减法函数只支持较大的数减去较小的数; 函数参数为操作数a,操作数b,存放结果c,进制 radix 推荐设为10; 大数格式为,a[0] 表示位数,a[1] 存放个位,依次存放高位 main 为测试函数; #includeiostrea
除了除法取模两个函数,每个运算函数不依赖其它函数; 减法函数只支持较大的数减去较小的数; 函数参数为操作数a,操作数b,存放结果c,进制 radix 推荐设为10; 大数格式为,a[0] 表示位数,a[1] 存放个位,依次存放高位 main 为测试函数; #include<iostream> //#include<cstring> using namespace std; void StrToDigit(const char c[],int a[]); void DigitToStr(const int a[],char c[]); int Dcmp(const int a[],const int b[]);//return a - b void Dadd(const int a[],const int b[],int c[],int radix);//c = a + b void Dsub(const int a[],int radix);//c = a - b void Dmul(const int a[],int radix);//c = a * b void Ddiv(const int a[],int radix);//c = a / b void Dmod(const int a[],int radix);//c = a % b; int main(void){ int a[100],b[100],c[100]; char str[100]; cout<<"input a:"; cin>>str; StrToDigit(str,a); cout<<"input b:"; cin>>str; StrToDigit(str,b); Dadd(a,b,c,10);//10进制 DigitToStr(c,str); cout<<"a + b = "<<str<<endl; if(Dcmp(a,b)>=0){ Dsub(a,10);//10进制 DigitToStr(c,str); cout<<"a - b = "<<str<<endl; }else{ Dsub(b,a,str); cout<<"b - a = "<<str<<endl; } Dmul(a,str); cout<<"a * b = "<<str<<endl; Ddiv(a,str); cout<<"a / b = "<<str<<endl; Dmod(a,str); cout<<"a % b = "<<str<<endl; return 0; } void StrToDigit(const char c[],int a[]) { a[0]=0; while(c[a[0]]!=' ') a[0]++; // a[0]=strlen(c); int i; for(i=1;i<=a[0];i++){ a[i]=c[a[0]-i]-'0'; } } void DigitToStr(const int a[],char c[]) { int i; for(i=0;i<a[0];i++){ c[i]=a[a[0]-i]+'0'; } c[i]=' '; } int Dcmp(const int a[],const int b[]) //return a-b; { int flag; if(a[0]==b[0]){ int i = a[0]; for(;i>=1;i--){ if(a[i]!=b[i]) break; } flag = a[i]-b[i]; }else flag = a[0]-b[0]; return flag; } void Dadd(const int a[],int radix) // c = a + b; radix 为进制,a[0] 为位数 { int i; for(i=1;i<=a[0] || i<=b[0] ;i++){ c[i] = 0; if(i<=a[0]) c[i] += a[i]; if(i<=b[0]) c[i] += b[i]; } c[0] = i; c[i] = 0; for(i=1;i<c[0];i++) { c[i+1] += c[i]/radix; c[i] = c[i]%radix; } while(c[c[0]]==0){ c[0]--; } } void Dsub(const int a[],int radix) // c = a - b; a > b ; radix 为进制,a[0] 为位数,{ int i; for(i=0;i<=a[0];i++)c[i]=a[i]; for(i=1;i<=c[0];i++){ if(i<=b[0]){ if(c[i]>=b[i])c[i] -= b[i]; else{ c[i+1]--; c[i] += radix; c[i] -= b[i]; } }else{ if(c[i]>=0)break; c[i] += radix; c[i+1] --; } } while(c[c[0]]==0){ c[0]--; } } void Dmul(const int a[],int radix) // c = a * b; radix 为进制,a[0] 为位数 { int i,j; c[0]=a[0]+b[0]; for(i=1;i<=c[0];i++)c[i]=0; for(i=1;i<=a[0];i++){ for(j=1;j<=b[0];j++){ c[i+j-1] += a[i]*b[j]; } } for(i=1;i<c[0];i++) { c[i+1] += c[i]/radix; c[i] = c[i]%radix; } while(c[c[0]]==0){ c[0]--; } } void Ddiv(const int a[],int radix) // c = a / b; radix 为进制,a[0] 为位数,用到了 Dcmp 、Dmul 函数 { if(Dcmp(a,b)<0){//if(a<b) c[0]=1;c[1]=0; }else if(Dcmp(a,b)==0){ c[0]=1;c[1]=1; }else{ int i; int temp[a[0]+2]; c[0] = a[0]-b[0]+1; for(i=1;i<=c[0];i++)c[i]=0; for(i = c[0];i>=1;i--){ while(1){ Dmul(b,temp,radix); if(Dcmp(temp,a)>0){ c[i]--;break; } c[i]++; } } while(c[c[0]]==0)c[0]--; } } void Dmod(const int a[],int radix) // c = a % b; { int temp[a[0]+1]; int temp2[a[0]+1]; Ddiv(a,radix); Dmul(temp,temp2,radix); Dsub(a,radix); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |