函数参数为操作数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]]!='\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]='\0'; } 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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。