encabezamiento
//
// Created by zhengwei.
//
#include <iostream>
#include <string>
using namespace std;
/**
* 去除头部的0
* @param str
* @return
*/
string dezero(const string str);
/**
* 加法
* @param a
* @param b
* @return
*/
string add(string a, string b);
/**
* 在前面添加0
* @param basic_string
* @param cnt 0的个数
*/
void prependZero(string &basic_string, unsigned long cnt);
/**
* 整数转字符串
* @param i
* @return
*/
string int2string(int i);
/**
* 减法
* @param a
* @param b
* @return
*/
string subtract(string a, string b);
/**
* 比较a,b代表的整数哪个更大
* a>b,返回1
* a=b,返回0
* a<b,返回-1
* @param a
* @param b
* @return
*/
int cmp(string a, string b);
/**
* 除法
* @param a
* @param b
* @param p 小数点后位数
* @return
*/
string divide(string a, string b, int p);
archivo de origen
//
// Created by zhengwei.
//
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include "BigNumber.h"
using namespace std;
int main(int argc, const char *argv[]) {
// string s = dezero("000234");
string addAns = add("9999999999999999999999",
"1111111111111111111111");
// addAns = add("103", "98");
// string subAns = subtract(addAns, "1111111111111111111111");
string subAns = subtract("89", "123");
// string dvdAns = divide("10", "2", 0);
string dvdAns = divide("1", "3", 10);
cout << dvdAns << endl;
return 0;
}
string divide(string a, string b, int p) {
string ans;
int inte = 0;
while (cmp(a, b) >= 0) {
a = subtract(a, b);
inte++;
}
ans.append(int2string(inte));
if (p <= 0) {
return ans;
}
ans.append(".");
// 此时a已经小于b
int p1 = 0;
while (p1 < p) {
int zeroCnt = 0;
while (cmp(a, b) == -1) {
a = a + "0";//后面拼一个0,代表乘以10
zeroCnt++;
if (zeroCnt > 1) {
ans.append("0");
p1++;
if (p1 == p) {
return ans;
}
}
}
int t = 0;
while (cmp(a, b) >= 0) {
a = subtract(a, b);
t++;
}
ans.append(int2string(t));
p1++;
}
return ans;
}
string subtract(string a, string b) {
string ans;
bool negetive = false;
unsigned long lenA = a.length();
unsigned long lenB = b.length();
unsigned long len;
string x, y;
// 补0,定大数在前等准备工作
if (lenA > lenB) {
len = lenA;
prependZero(b, lenA - lenB);
x = a;
y = b;
} else if (lenA < lenB) {
len = lenB;
prependZero(a, lenB - lenA);
x = b;
y = a;
negetive = true;
} else {
len = lenA;
if (cmp(a, b) > 0) {
x = a;
y = b;
} else if (cmp(a, b) < 0) {
x = b;
y = a;
negetive = true;
} else {
return "0";
}
}
// 开始做减法
int jie = 0;
for (int i = len - 1; i >= 0; --i) {
int sub = (x[i] - '0') - jie - (y[i] - '0');//按位减法
if (sub < 0) {
jie = 1;
ans.insert(0, int2string(sub + 10));
} else {
jie = 0;
ans.insert(0, int2string(sub));
}
}
ans = dezero(ans);
if (negetive) {
ans.insert(0, "-");
}
return ans;
}
int cmp(string a, string b) {
a = dezero(a);
b = dezero(b);
if (a.length() > b.length()) {
return 1;
}
if (a.length() < b.length()) {
return -1;
}
int i = 0, j = 0;
while (i != a.length() && j != b.length()) {
if (a[i] > b[j]) {
return 1;
} else if (a[i] < b[j]) {
return -1;
} else {
i++;
j++;
}
}
return 0;
}
string add(string a, string b) {
string ans;
unsigned long lenA = a.length();
unsigned long lenB = b.length();
unsigned long len;
if (lenA > lenB) {
len = lenA;
prependZero(b, lenA - lenB);
} else if (lenA < lenB) {
len = lenB;
prependZero(b, lenB - lenA);
} else {
len = lenA;
}
int jin = 0;
for (int i = len - 1; i >= 0; --i) {
int sum = (a[i] - '0') + (b[i] - '0') + jin;
if (sum >= 10) {
ans.insert(0, int2string(sum - 10));
jin = 1;
} else {
ans.insert(0, int2string(sum));
jin = 0;
}
}
if (jin == 1) {
ans.insert(0, "1");
}
return ans;
}
string int2string(int i) {
stringstream ss;
ss << i;
string ans;
ss >> ans;
return ans;
}
void prependZero(string &basic_string, unsigned long cnt) {
for (int i = 0; i < cnt; ++i) {
basic_string.insert(basic_string.begin(), '0');
}
}
string dezero(const string str) {
long cnt = 0;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == '0') {
cnt++;
} else {
break;
}
}
if (cnt == str.length()) {
return "0";
} else {
return str.substr(cnt);
}
}