版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38169413/article/details/82698617
大整数相加
/*******************************************************************************
功 能:超长整数相加
创建时间: 2018-08-05
作 者:Elvan
修改时间:
作 者:
********************************************************************************/
#include <iostream>
using namespace std;
/************************************************************
* 函 数 名:string Add(string a, string b)
* 函数功能:计算两个整数的和
* 函数参数:a,b-字符串(可能有负数的情况)
* 返 回 值:和
* 作 者:Elvan
* 创建日期:2018-08-03
* **********************************************************/
string Add(string a, string b)
{
//都是正数
if(a[0] != '-' && b[0] != '-')
{
while (a.size() < b.size())
a = "0" + a;
while (a.size() > b.size())
b = "0" + b;
int temp = 0, flag = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
temp = a[i] - '0' + b[i] - '0' + flag;
a[i] = temp % 10 + '0';
if (temp >= 10)
flag = 1;
else
flag = 0;
}
if (flag == 1)
a = "1" + a;
}
//都是负数
else if(a[0] == '-' && b[0] == '-')
{
a = a.substr(1);
b = b.substr(1);
while (a.size() < b.size())
a = "0" + a;
while (a.size() > b.size())
b = "0" + b;
int temp = 0, flag = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
temp = a[i] - '0' + b[i] - '0' + flag;
a[i] = temp % 10 + '0';
if (temp >= 10)
flag = 1;
else
flag = 0;
}
if (flag == 1)
a = "1" + a;
a = "-" + a;
}
//有一个是负数
else
{
//a是负数,b是正数
if(a[0] == '-')
a = a.substr(1);
if(b[0] == '-')
{
string tmp = b.substr(1);
a = b;
b = a;
}
//取绝对值大的哪一个
bool k;
if(a.size() <= b.size())
{
k = false;
}
else
k = true;
while (a.size() < b.size())
a = "0" + a;
while (a.size() > b.size())
b = "0" + b;
if(k)
{
string tmp = a;
a = b;
b = tmp;
}
int temp = 0, flag = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
if(b[i] - flag >= a[i])
{
temp = b[i] - a[i] - flag;
flag = 0;
}
else
{
temp = b[i] - a[i] + 10 - flag;
flag = 1;
}
a[i] = temp % 10 + '0';
}
//去除前面的0
while(a[0] == '0')
a = a.substr(1);
if (k)
a = "-" + a;
}
return a;
}
int main()
{
string a, b;
a = "99999999999999999";
b = "1";
cout << Add(a,b) <<endl;
return 0;
}
大整数相乘
/*******************************************************************************
功 能:超长整数相加
创建时间: 2018-09-14
作 者:Elvan
修改时间:
作 者:
********************************************************************************/
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//字符串相加函数
string add(string a, string b){
//都是正数
if (a[0] != '-' && b[0] != '-'){
while (a.size() < b.size())
a = "0" + a;
while (a.size() > b.size())
b = "0" + b;
int temp = 0, flag = 0;
for (int i = a.size() - 1; i >= 0; i--){
temp = a[i] - '0' + b[i] - '0' + flag;
a[i] = temp % 10 + '0';
if (temp >= 10)
flag = 1;
else
flag = 0;
}
if (flag == 1)
a = "1" + a;
}
return a;
}
//字符串乘一个字符函数
string multiplyHelper(string str, char x){
int b = x - '0';
int flag = 0; //进位标识符
for (int i = str.length() - 1; i >= 0; i--){
int a = str[i] - '0';
int result = a*b + flag;
str[i] = result % 10 + '0';
flag = result / 10;
}
if (flag != 0)
str = (char)(flag + '0') + str;
while (str.length() > 1 && str[0] == '0')
str = str.substr(1);
return str;
}
//字符串相乘函数
string multiply(string a, string b){
string res = "";
if (a.length() == 0 || b.length() == 0)
return "";
bool flag = false;
string strA = a, strB = b;
//如果a是负数
if (a[0] == '-'){
flag = ~flag;
strA = a.substr(1);
}
//如果b是负数
if (b[0] == '-'){
flag == true ? flag = false : flag = true;
strB = b.substr(1);
}
for (int i = strB.length() - 1; i >= 0; i--){
string result = multiplyHelper(strA, strB[i]);
int j = i;
while (++j < strB.length())
result = result + "0";
res = add(res, result);
}
while (res.length() > 1 && res[0] == '0')
res = res.substr(1);
if (flag == true && res != "0")
res = '-' + res;
return res;
}
int main(){
string a = "12", b = "13";
string tmp = multiply(a, b);
cout << tmp << endl;
return 0;
}