提交 1e3efe22 编写于 作者: 小代码2016's avatar 小代码2016

feat(calc_lib): 优化大数除法, 只实现了整数

上级 d3d21c4a
......@@ -17,13 +17,13 @@ public:
std::string divide(std::string x, std::string y);
const int compare(std::string x, std::string y);
int compare(std::string x, std::string y);
private:
/**
* 比较两个数字的大小
*/
// const int compare(std::string x, std::string y);
// int compare(std::string x, std::string y);
};
KHL_CALC_NAMESPACE_END
#endif // _KHL_CALC_DECIMAL_H_
\ No newline at end of file
......@@ -16,7 +16,7 @@ std::string Decimal::add(std::string x, std::string y)
{
if (x.size() > y.size())
{
auto len = x.size() - y.size();
int len = x.size() - y.size();
for (int i = 0; i < len; i++)
{
y.insert(0, "0");
......@@ -24,7 +24,7 @@ std::string Decimal::add(std::string x, std::string y)
}
else
{
auto len = y.size() - x.size();
int len = y.size() - x.size();
for (int i = 0; i < len; i++)
{
x.insert(0, "0");
......@@ -39,7 +39,7 @@ std::string Decimal::add(std::string x, std::string y)
*/
char *sx = const_cast<char *>(x.c_str());
char *sy = const_cast<char *>(y.c_str());
const size_t len = x.size();
const int len = x.size();
auto a = std::make_unique<int[]>(len);
auto b = std::make_unique<int[]>(len);
......@@ -54,7 +54,7 @@ std::string Decimal::add(std::string x, std::string y)
}
/** 计算 */
const size_t size = len + 1;
const int size = len + 1;
auto c = std::make_unique<int[]>(size);
for (int i = 0; i < len; i++)
......@@ -100,7 +100,7 @@ std::string Decimal::substract(std::string x, std::string y)
{
if (x.size() > y.size())
{
auto len = x.size() - y.size();
int len = x.size() - y.size();
for (int i = 0; i < len; i++)
{
y.insert(0, "0");
......@@ -108,7 +108,7 @@ std::string Decimal::substract(std::string x, std::string y)
}
else
{
auto len = y.size() - x.size();
int len = y.size() - x.size();
for (int i = 0; i < len; i++)
{
x.insert(0, "0");
......@@ -137,7 +137,7 @@ std::string Decimal::substract(std::string x, std::string y)
*/
char *sx = const_cast<char *>(s1.c_str());
char *sy = const_cast<char *>(s2.c_str());
const size_t len = s1.size();
const int len = s1.size();
auto a = std::make_unique<int[]>(len);
auto b = std::make_unique<int[]>(len);
......@@ -152,7 +152,7 @@ std::string Decimal::substract(std::string x, std::string y)
}
/** 计算 */
const size_t size = len;
const int size = len;
auto c = std::make_unique<int[]>(size);
for (int i = 0; i < len; i++)
{
......@@ -197,8 +197,8 @@ std::string Decimal::multiply(std::string x, std::string y)
*/
char *sx = const_cast<char *>(x.c_str());
char *sy = const_cast<char *>(y.c_str());
const size_t la = x.size() + 1;
const size_t lb = y.size() + 1;
const int la = x.size() + 1;
const int lb = y.size() + 1;
auto a = std::make_unique<int[]>(la);
auto b = std::make_unique<int[]>(lb);
......@@ -213,7 +213,7 @@ std::string Decimal::multiply(std::string x, std::string y)
}
/** 计算 */
const size_t lc = x.size() + y.size() + 1;
const int lc = x.size() + y.size() + 1;
auto c = std::make_unique<int[]>(lc);
for (int i = 1; i < la; i++)
{
......@@ -254,6 +254,12 @@ std::string Decimal::divide(std::string x, std::string y)
return "1";
}
// 除数为 1 , 直接返回被除数
if (0 == y.compare("1"))
{
return x;
}
std::string str = "0";
std::string remainder;
// 被除数只比除数多一位, 则使用减法
......@@ -271,22 +277,30 @@ std::string Decimal::divide(std::string x, std::string y)
{
// 被除数比除数多两位或以上, 先用加法再用减法
// 余数
str = "1";
str = "0";
std::string times = "1";
std::string num = y;
while (compare(num, x) <= 0)
std::string t = x;
while (t.size() - y.size() >= 2)
{
remainder = num;
num = add(num, num);
if (compare(num, x) > 0)
while (compare(num, t) <= 0)
{
break;
remainder = num;
num = add(num, num);
if (compare(num, t) >= 0)
{
num = y;
str = add(str, times);
times = "1";
t = substract(t,remainder);
break;
}
times = multiply(times, "2");
}
str = multiply(str, "2");
}
if (compare(num, x) > 0)
remainder = t;
if (compare(remainder, y) >= 0)
{
remainder = substract(x,remainder);
while (compare(remainder, y) >= 0)
{
remainder = substract(remainder, y);
......@@ -298,7 +312,7 @@ std::string Decimal::divide(std::string x, std::string y)
return str;
}
const int Decimal::compare(std::string x, std::string y)
int Decimal::compare(std::string x, std::string y)
{
if (x.size() < y.size())
{
......
......@@ -9,7 +9,7 @@ int main()
// {
// std::cout << decimal->divide("531518", "123") << std::endl;
std::cout << decimal->divide("111", "9") << std::endl;
std::cout << decimal->divide("222", "2") << std::endl;
std::cout << "===================" << std::endl;
// }
return 0;
......
......@@ -50,7 +50,7 @@ TEST_CASE("test_divide")
// std::cout << decimal->divide("10", "5") << std::endl;
// std::cout << decimal->divide("531518", "123") << std::endl;
std::cout << decimal->divide("111", "9") << std::endl;
std::cout << decimal->divide("222", "2") << std::endl;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册