您的位置:首页 > 其它

大数加减乘除

2013-08-30 16:00 190 查看
#include <iostream>
using namespace std;
#define MAXLEN  255
int* str2int(char* str)
{
int len = strlen(str), i;
int * a = new int[len*sizeof(int)];
for(i=0; i<len; ++i)
a[i] = (int)(str[len-i-1] - '0');
return a;
}

char* int2str(int* a,int len)
{
int i;
char* str = new char[(len+1)*sizeof(char)];
for(i=0; i<len; ++i)
str[i] = (char)(a[len-i-1] + '0');
str[len] = '\0';
return str;
}
//归整操作
int check(int * a, int len)
{
int k;
while(a[len-1] == 0 && len>1) len--;
for(k=0; k<len; k++)
{
if(a[k]>=10)
{
a[k+1] = a[k+1] + a[k]/10;
a[k] = a[k]%10;
}
}
if(a[k]!=0) len++;
return len;
}

char* addition(char* str1, char* str2)
{
int len,len1,len2,i;
len1 = strlen(str1);
len2 = strlen(str2);
len = (len1>=len2)?len1:len2;
int* t1 = new int[(len+1)*sizeof(int)];
int* t2 = new int[(len+1)*sizeof(int)];
t1 = str2int(str1);
t2 = str2int(str2);
for(i=len1; i<len+1; ++i)
t1[i] = 0;
for(i=len2; i<len+1; ++i)
t2[i] = 0;
for(i=0; i<len; ++i)
t1[i]+=t2[i];
len = check(t1,len+1);
return int2str(t1,len);
}

char* subtract(char* str1, char* str2)
{
int i,len1,len2,len,flag=0;
len1 = strlen(str1);
len2 = strlen(str2);
len = (len1>=len2)?len1:len2;
char* temp = new char[len*sizeof(char)];
char* result = new char[(len+1)*sizeof(char)];
int* t1 = new int[len*sizeof(int)];
int* t2 = new int[len*sizeof(int)];
if(len1<len2 || (len1==len2)&&strcmp(str1,str2)<0)
{
flag = 1;
strcpy(temp, str1);
strcpy(str1, str2);
strcpy(str2, temp);
len1=strlen(str1);
len2=strlen(str2);
}

t1 = str2int(str1);
t2 = str2int(str2);
for(i=len1; i<len; ++i) t1[i]=0;
for(i=len2; i<len; ++i) t2[i]=0;
for(i=0; i<len; ++i)
{
if(t1[i] >= t2[i]) t1[i]-=t2[i];
else
{
t1[i]-=t2[i];
int c = t1[i]*(-1)/10+1;
t1[i] = t1[i] + c*10;
t1[i+1] -= c;
}
}
int begin=0;
while(t1[len-1]==0 && len>1) len--;
if(flag)
{
result[0] = '-';
begin++;
len++;
}
for(;begin<len; ++begin) result[begin] = (char)(t1[len-begin-1] + '0');
result[begin] = '\0';
return result;
}

char* multiply(char* str1, char* str2)
{
int i,j,len,len1,len2;
len1=strlen(str1);
len2=strlen(str2);
len = len1 + len2;
int* t1 = new int[len1*sizeof(int)];
int* t2 = new int[len2*sizeof(int)];
int* result = new int[len*sizeof(int)];
t1=str2int(str1);
t2=str2int(str2);
for(i=0; i<len; ++i)
result[i]=0;
for(i=0; i<len1; ++i)
for(j=0; j<len2; ++j)
result[i+j]+=t1[i]*t2[j];
check(result, len);
while(result[len-1]==0 && len>1) len--;
return int2str(result, len);
}

void divide(char* str1, char* str2, char*& remainder, char*& quotient)
{
int len1, len2, len, i;
len1 = strlen(str1);
len2 = strlen(str2);
remainder = new char[len1*sizeof(char)];
quotient = new char[len1*sizeof(char)];
if(len1<len2 || ((len1==len2)&&strcmp(str1,str2)<0))
{
remainder = str1;
quotient = "0";
}
else if(strcmp(str1,str2) == 0)
{
remainder = "0";
quotient = "1";
}
else
{
int* temp = new int[len2*sizeof(int)];
remainder[0] = '\0';
len = strlen(remainder);
for(i=0; i<len1; ++i)
{
temp[i] = 0;
remainder[len] = str1[i];
remainder[len+1] = '\0';
//cout<<remainder<<endl;
len = strlen(remainder);
while(len > len2 ||(len==len2 && strcmp(remainder, str2)>=0))
{
remainder = subtract(remainder, str2);
if(remainder[0] == '0')
remainder[0] = '\0';
//cout<<remainder<<endl;
len = strlen(remainder);
temp[i]++;
}
quotient[i] = (char)(temp[i] + '0');
}
int j = 0;
while(quotient[j] == '0' && j<len1) j++;  //删除前导0
for(i=0; i<len1-j; ++i)
quotient[i] = quotient[j+i];
quotient[len1-j] = '\0';
}
}

int main()
{
char str1[MAXLEN], str2[MAXLEN], str[MAXLEN];
char* remainder,*quotient;
cin>>str1>>str2;
divide(str1, str2, remainder, quotient);
//cout<<multiply(str1, str2)<<endl;
cout<<quotient<<" "<<remainder<<endl;
system("pause");
return 0;
}


参考《ACM/ICPC程序设计与分析》 清华大学版。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: