除了除法取模两个函数,每个运算函数不依赖其它函数;
减法函数只支持较大的数减去较小的数;
函数参数为操作数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[],const int b[],int c[],int radix);//c = a - b
void Dmul(const int a[],const int b[],int c[],int radix);//c = a * b
void Ddiv(const int a[],const int b[],int c[],int radix);//c = a / b
void Dmod(const int a[],const int b[],int c[],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,b,c,10);//10进制
DigitToStr(c,str);
cout<<"a - b = "<<str<<endl;
}else{
Dsub(b,a,c,10);//10进制
DigitToStr(c,str);
cout<<"b - a = "<<str<<endl;
}
Dmul(a,b,c,10);//10进制
DigitToStr(c,str);
cout<<"a * b = "<<str<<endl;
Ddiv(a,b,c,10);//10进制
DigitToStr(c,str);
cout<<"a / b = "<<str<<endl;
Dmod(a,b,c,10);//10进制
DigitToStr(c,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[],const int b[],int c[],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[],const int b[],int c[],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[],const int b[],int c[],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[],const int b[],int c[],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,c,temp,radix);
if(Dcmp(temp,a)>0){
c[i]--;break;
}
c[i]++;
}
}
while(c[c[0]]==0)c[0]--;
}
}
void Dmod(const int a[],const int b[],int c[],int radix)
// c = a % b;
{
int temp[a[0]+1];
int temp2[a[0]+1];
Ddiv(a,b,temp,radix);
Dmul(temp,b,temp2,radix);
Dsub(a,temp2,c,radix);
}