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

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

上级 25280910
......@@ -6,7 +6,7 @@ project(khl_calc VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# set(CMAKE_CONFIGURATION_TYPES Debug)
set(CMAKE_CONFIGURATION_TYPES Debug)
# 设置 cmake 脚本目录
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
......
......@@ -243,46 +243,56 @@ std::string Decimal::multiply(std::string x, std::string y)
std::string Decimal::divide(std::string x, std::string y)
{
if (0 == x.compare("0") || compare(x,y) < 0)
// 被除数为 0 或者被除数小于除数, 均返回 0
if (0 == x.compare("0") || compare(x, y) < 0)
{
return "0";
}
if(0 == compare(x,y) )
// 相等直接返回 1
if (0 == compare(x, y))
{
return "1";
}
/**
* 字符串转换为倒置的 int 数组
* x = 123 , y = 4567
* x = 321 , y = 7654
*/
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;
auto a = std::make_unique<int[]>(la);
auto b = std::make_unique<int[]>(lb);
for (int i = 1; i < la; i++)
std::string str = "0";
std::string remainder;
// 被除数只比除数多一位, 则使用减法
if (x.size() - y.size() < 2)
{
a[la - i] = sx[i - 1] - '0';
// 余数
remainder = x;
while (compare(remainder, y) >= 0)
{
remainder = substract(remainder, y);
str = add(str, "1");
}
}
for (int i = 1; i < lb; i++)
else
{
b[lb - i] = sy[i - 1] - '0';
}
std::string str = "0";
// 被除数比除数多两位或以上, 先用加法再用减法
// 余数
str = "1";
std::string num = y;
while (compare(num, x) <= 0)
{
remainder = num;
num = add(num, num);
if (compare(num, x) > 0)
{
break;
}
str = multiply(str, "2");
}
// 余数
std::string remainder = x;
while (compare(remainder, y) >= 0)
{
remainder = substract(remainder,y);
str = add(str,"1");
if (compare(num, x) > 0)
{
remainder = substract(x,remainder);
while (compare(remainder, y) >= 0)
{
remainder = substract(remainder, y);
str = add(str, "1");
}
}
}
return str;
......
......@@ -9,7 +9,7 @@ int main()
// {
// std::cout << decimal->divide("531518", "123") << std::endl;
std::cout << decimal->divide("9999", "2") << std::endl;
std::cout << decimal->divide("111", "9") << std::endl;
std::cout << "===================" << std::endl;
// }
return 0;
......
......@@ -50,10 +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("9999", "2") << std::endl;
std::cout << decimal->divide("99999", "2") << std::endl;
std::cout << decimal->divide("999999", "2") << std::endl;
std::cout << decimal->divide("9999999", "2") << std::endl;
std::cout << decimal->divide("111", "9") << std::endl;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册