大数乘法、加法、减法、除法
发布时间:2020-12-14 03:16:27 所属栏目:大数据 来源:网络整理
导读:乘法 (1)转换并反转,字符串转换为数字并将字序反转; (2)逐位相乘,结果存放在result_num[i+j]中; (3)处理进位,消除多余的0; (4)转换并反转,将计算结果转换为字符串并反转。 除法 就是一直减,如果被除数远远大于除数,那么运行时间特别长。应
乘法(1)转换并反转,字符串转换为数字并将字序反转; (2)逐位相乘,结果存放在result_num[i+j]中; (3)处理进位,消除多余的0; (4)转换并反转,将计算结果转换为字符串并反转。 除法就是一直减,如果被除数远远大于除数,那么运行时间特别长。应该有更好的方法。 加法、减法减法思路类似加法,加法思路就是考虑进位的影响。 代码#include<iostream>
using namespace std;
#include<algorithm>
#define MAXN 50
char *big_multi(const char data11[],const char data22[])
{
int len1 = strlen(data11);
int len2 = strlen(data22);
char *data1 = new char[len1 + 1];
char *data2 = new char[len2 + 1];
memcpy(data1,data11,len1);
memcpy(data2,data22,len2);
for (int i = 0; i < len1 / 2; i++)
swap(data1[i],data1[len1 - i - 1]);
for (int i = 0; i < len2 / 2; i++)
swap(data2[i],data2[len2 - i - 1]);
int len = len1 + len2;
int *res = new int[len];
memset(res,0,sizeof(int)*len);
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
res[i + j] = res[i + j] + (data1[i] - '0')*(data2[j] - '0');//存储data1的第i位和data2的第j位相乘的结果,存储在第i+j位上
int c = 0,k=0;
for (int i = 0; i <= len - 1; i++)//进位处理
{
res[i] = res[i] + k;
k = res[i] / 10;
res[i] = res[i] % 10;
}
int new_len=0;//实际的长度
for (new_len = len - 1; new_len >= 0; new_len--)
if (res[new_len] != 0)
break;
char *new_res = new char[new_len+1];
new_res[new_len + 1] = ' ';
for (int i = new_len; i >= 0; i--)
new_res[new_len - i] = res[i] + '0';
return new_res;
}
char *bigadd(const char *data1,const char*data2)//不考虑正加负以及负加正
{
int len1 = strlen(data1),len2 = strlen(data2);
int i = len1 - 1,j = len2 - 1;
int len = (max(len1,len2) + 1);
char *res = new char[len];
memset(res,'0',sizeof(char)*len);
int k = 0,temp=0;
while (i >= 0 && j >= 0)
{
temp= (data1[i] - '0') + (data2[j] - '0') +temp;
res[k] = temp % 10+'0';
temp = temp / 10;
k++;
i--;
j--;
}
while (i >= 0)
{
temp = (data1[i] - '0') + temp;
res[k] = temp % 10 + '0';
temp = temp / 10;
k++;
i--;
}
while (j >= 0)
{
temp = (data2[j] - '0') + temp;
res[k] = temp % 10 + '0';
temp = temp / 10;
k++;
j--;
}
if (temp > 0) res[k++] = temp % 10 + '0';
res[k] = ' ';
len1 = strlen(res);
for (int i = 0; i < len1 / 2; i++)
swap(res[i],res[len1 - i - 1]);
return res;
}
char *bigminus_direct(const char *data11,const char*data22)
{
int len1 = strlen(data11);
int len2 = strlen(data22);
char *data1 = new char[len1 + 1];
char *data2 = new char[len2 + 1];
memcpy(data1,len1 + 1);
memcpy(data2,len2 + 1);
//下面处理两个正数相减
bool flag = 0;//表示正
if (len1 < len2)//交换
{
flag = 1;
swap(data2,data1);
}
else if (len2 == len1)
{
if (strcmp(data1,data2) < 0)
{
flag = 1;
swap(data2,data1);
}
if (strcmp(data1,data2) == 0)
{
char *res = new char[2];
res[1] = ' ';
res[0] = '0';
return res;
}
}
int i = strlen(data1) - 1,j = strlen(data2) - 1;
int carry = 0;
char *res = new char[strlen(data1) + 2];
res[strlen(data1) + 1] = ' ';
memset(res,sizeof(char)*(strlen(data1)));
int k = strlen(data1);
while (i >= 0 && j >= 0)
{
int tmp = data1[i--] - data2[j--] - carry;
if (tmp < 0)
{
tmp += 10;
carry = 1;
}
else
carry = 0;
res[k--] = tmp + '0';
}
while (i >= 0)
{
int tmp = data1[i--] - '0' - carry;
if (tmp < 0)
{
tmp += 10;
carry = 1;
}
else
carry = 0;
res[k--] = tmp + '0';
}
i = 0;
while (res[i] == '0') i++;
if (flag)
{
res[i - 1] = '-';
i--;
}
char *res_new = new char[strlen(data1) + 2 - i];
for (int k = 0; k<strlen(data1) + 2 - i; k++)
res_new[k] = res[i + k];
return res_new;
}
char *bigminus(const char *data11,const char*data22)
{
//-a-b:负减去正,等于两个正数相加取负,以及正-负
//a-b与-b+a 正-正,负-负
//先不考虑其中一个为空的
int len1 = strlen(data11),len2 = strlen(data22);
if (data11[0] != '-'&&data22[0] != '-')
return bigminus_direct(data11,data22);
else if (data11[0] != '-'&&data22[0] == '-')
{
char *data23 = new char[len2];
for (int i = 0; i < len2 - 1; i++)
data23[i] = data22[i + 1];
data23[len2 - 1] = ' ';
return bigadd(data11,data23);
}
else if (data11[0] == '-'&&data22[0] != '-')
{
char *data23 = new char[len1];
for (int i = 0; i < len1 - 1; i++)
data23[i] = data11[i + 1];
data23[len1 - 1] = ' ';
char *res=bigadd(data23,data22);
int new_len=strlen(res);
char *new_res=new char[new_len+2];
new_res[new_len+1]=' ';
new_res[0]='-';
for(int i=0;i<new_len;i++)
new_res[i+1]=res[i];
return new_res;
}
else//都是负的,等效于第二个减去第一个
{
char *data23 = new char[len2];
for (int i = 0; i < len2 - 1; i++)
data23[i] = data22[i + 1];
data23[len2 - 1] = ' ';
char *data13 = new char[len1];
for (int i = 0; i < len1 - 1; i++)
data13[i] = data11[i + 1];
data13[len1 - 1] = ' ';
return bigminus_direct(data23,data13);
}
}
char* bigDivision(const char *data11,const char*data22)//只考虑两个正的
{
int len1 = strlen(data11),len2 = strlen(data22);
if(len1<len2)
{
char *res=new char[2];
res[0]='0';
res[1]=' ';
return res;
}
char *res=new char[len1-len2+1];
memset(res,sizeof(char)*(len1-len2+2));
res[len1-len2+1]=' ';
char *tmp= bigminus(data11,data22);
while(tmp[0]!='-')
{
char *rete=new char[2];
rete[0]='1';
rete[1]=' ';
res=bigadd(rete,res);
delete [] rete;
tmp=bigminus(tmp,data22);
}
int i = 0;
while (res[i] == '0') i ++ ;
char *new_res = new char[strlen(res) - i + 1];
for (int j = 0; j < strlen(res) - i ; j++)
new_res[j] = res[i + j];
new_res[strlen(res) - i] = ' ';
return new_res;
}
int main()
{
char data1[MAXN],data2[MAXN];
while (cin >> data1 >> data2)
{
cout << bigDivision(data1,data2) << endl;
/*cout << bigminus(data1,data2) << endl; cout << big_multi(data1,data2) << endl; cout << bigadd(data1,data2) << endl;*/
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |