#include<iostream>
#include <string>
using namespace std;
class Mutiply
{
public:
string mutiply(string num1 , string num2)
{
long len1 = num1.size();
long len2 = num2.size();
long * a = new long[len1];
long * b = new long[len2];
int len =len1 + len2;
long * result = new long[len];
//先计算
for (long i = 0; i < len1 ; i++)
{
a[i] = num1[i] - '0';
}
for (long j = 0; j < len2 ; j++)
{
b[j] = num2[j] - '0';
}
for (long i = 0 ; i < len ; i++)
{
result[i] = 0;
}
// i = len1 + len2 -2
for(long i = 0; i < len1 ; i++ )
{
for (long j = 0 ; j < len2; j++)
{
result[i + j] += a[i] * b[j];
// cout << result[i + j] << endl;
}
}
//处理进位
for (long i =len -2; i > 0; i--)
{
{
result[i - 1] += result[i]/10;
result[i] = result[i] % 10;//当前位置的值
}
}
string resultstr;
resultstr = "";
int temp = result[0]/10;
result[0] %= 10;
if (temp>0)
{
resultstr = string(1,'0'+temp);
}
for( long i = 0; i < len -1; i++ )
{
string s(1,result[i]+'0');
resultstr += "" + s ;
}
return resultstr;
}
};
//大数的加法
class Addition
{
public:
string additon(string str1, string str2)
{
unsigned int len1 = str1.size();
unsigned int len2 = str2.size();
unsigned int len = len1 > len2 ? len1 : len2;
int * a = new int[len];
int * b = new int[len];
int *result = new int[len];//多一位用来处理最后一位的进位
fill(a,a+len,0), fill(b, b+len,0), fill(result, result + len,0);
for (int i = 0; i <len1; i++)
{
a[i] = str1[i] -'0';
}
for (int j = 0; j <len2; j++)
{
b[j] = str2[j] -'0';
}
for (unsigned int i =len -1 ; i > 0; i--)//最高位
{
result[i] += a[i] + b[i];
if (result[i]>=10)
{
result[i] = result[i] -10;
result[i - 1]++;
}
//cout << result[i] << endl;
}
//处理最高位
int temp =0;
result[0] += a[0] + b[0];
if (result[0] >= 10)
{
result [0] = result[0] -10;
temp = 1;
}
string resultStr = "";
if (temp >0)
{
resultStr = string(1,'0' + temp);
}
for (int i =0; i< len; i++)
{
resultStr += string(1,'0' + result[i]);
}
return resultStr;
}
};
//大数减法
class Subtraction
{
public:
string subtraction(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
int len = len1 > len2 ? len1 : len2;
int *a = new int[len];
int *b = new int[len];
int *result = new int[len];
fill(a,a+len,0);
fill(b,b+len,0);
fill(result,result+len,0);
int symbol = 1;//如果为-1 则表明是正数 如果是1 则是正数
//处理计算结果是 正数 负数 的问题
if (len1 < len2)
{
symbol = -1;
string tmp ="";
tmp = str1;
str1 = str2;
str2 = tmp;
int it = len1;
len1 = len2;
len2 = it;
}
else if (len1 == len2)
{
for (int i =0 ; i< len ; i++)
{
if (str1[i] ==str2[i] )
{
continue;
}
else if (str1[i] < str2[i])
{
symbol = -1;
string tmp ="";
tmp = str1;
str1 = str2;
str2 = tmp;
int it = len1;
len1 = len2;
len2 = it;
break;
}
else
{
break;
}
}
}
for (int i = 0; i< len1; i++)
{
a[len1 - i -1] = str1[i]-'0';
}
for (int i = 0; i< len2; i++)
{
b[len2 - i - 1] = str2[i]-'0';
}
int jiewei = 0;
for (int k =0; k <len ; k++)
{
//如果存在借位 这个位置
if (jiewei == 0)
{
if (a[k] -b[k] < 0)
{
result[k] = a[k] - b[k] + 10;
jiewei = 1;
}
else
{
result[k] = a[k] - b[k];
}
}
else
{
if (a[k] - b[k] -1 <0)
{
result[k] = a[k] - b[k] -1 +10;
jiewei = 1;
}
else
{
result[k] = a[k] - b[k] -1;
jiewei = 0;
}
}
}
//0-n中 0是低位 那么要找第一个不为0的高位
int nozero =0;
for (int i = len -1; i >=0 ; i--)
{
if (result[i] !=0)
{
nozero = i;
break;
}
}
//输出结果
string resultstr = "";
if (symbol == -1)
{
resultstr = "-";
}
for (int i =nozero; i >= 0; i--)
{
resultstr += string(1,'0' + result[i]);
}
return resultstr;
}
protected:
private:
};
class Division
{
public:
string division(string str1, string str2)
{
//
reverse(str1.begin(),str1.end());
reverse(str2.begin(),str2.end());
int len1 = str1.size();
int len2 = str2.size();
if (len1 -len2 < 0)
{
return "0";
}
int *a = new int[len1];
int *b = new int[len1];
fill(a, a + len1, 0),fill(b, b + len1, 0);
for (int i = 0; i < len1; i++)
{
a[i] = str1[i] -'0';
}
for (int i = 0; i < len2; i++)
{
b[i] = str2[i] -'0';
}
int dValue = len1 - len2;
int *result = new int[dValue +1];
fill(result, result + dValue +1, 0);
//被除数的处理
for (int i = len1 - 1; i >=0; i--)
{
if (i >=dValue)
{
b[i] = b[i - dValue];//向高位移动
}
else
{
b[i] = 0;
}
}
//
for (int i =0 ; i < len1 ; i++)
{
cout << a[i];
}
cout <<endl;
for (int i =0 ; i < len1 ; i++)
{
cout << b[i];
}
cout <<endl;
len2 = len1;
int flag = 0;
for (int j = 0; j <= dValue; j++)
{
while((flag = subtraction(a, len1, b+j, len2 - j)) != -1)//运算符的优先级
{
len1 = flag;
result[j]++;//每一位的值
}
}
//
int high = dValue;
for (int i =0; i<= dValue ; i++ )
{
if (result[i]>0)
{
high = i;
break;
}
}
string resultstr = "";
for (int i = high; i <= dValue; i++)
{
resultstr += string(1,result[i]+'0');
}
return resultstr;
}
protected:
private:
//数组0-N分别为待处理数据的从低到高的顺序
int subtraction(int * p1, int len1, int *p2, int len2)
{
if (len1 < len2)
{
return -1;
}
if (len1 == len2)
{
for (int i = len1 -1; i >=0; i--)
{
if (p1[i] > p2[i])
{
break;
}
else if (p1[i] < p2[i])
{
return -1;
}
}
}
for (int i =0; i <=len1 - 1; i++)
{
p1[i] -= p2[i];
if (p1[i] < 0)
{
p1[i] +=10;
p1[i+1]--;
}
}
for (int i = len1 -1; i >=0; i--)
{
if (p1[i])
{
return i + 1;//返回最高位 数组是从 0 开始的 因而需要+1
}
}
return 0;
}
};
int main()
{
string s1,s2;
cin>>s1>>s2;
Mutiply m;
cout << m.mutiply(s1,s2) << endl;
Addition a;
cout << a.additon(s1, s2)<< endl;
Subtraction s;
cout <<s.subtraction(s1, s2)<<endl;
Division d;
cout<< d.division(s1,s2);
system("pause");
return 0;
}
算法第七节(第2部分:大数的四则远算)
猜你喜欢
转载自blog.csdn.net/weixin_39804483/article/details/87879014
今日推荐
周排行