大数模板
来源:互联网 发布:查看linux磁盘读写速率 编辑:程序博客网 时间:2024/06/07 20:41
大数思路简单,实现起来比较复杂,考虑的情况比较多。
C++的模板,用char数组实现的点击打开链接
尝试写了几个用String实现的
string add(string num1, string num2) {
string num(1000, '0');
if(num1.empty() || num2.empty())
{
num = "Data error!";
return num;
}
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int i, len;
for(i = 0; i < num1.size(); ++i)
num[i] = num1[i];
for(i = 0; i < num2.size(); ++i)
num[i] = num[i] - '0' + num2[i];
len = max(num1.size(), num2.size()); //len取最大确保处理完全部进位
for(i = 0; i < len; ++i)
{
num[i + 1] = num[i + 1] + (num[i] - '0') / 10;
num[i] = (num[i] - '0') % 10 + '0';
}
reverse(num.begin(), num.end());
if(num.find_first_not_of('0') == string::npos)
num = '0';
else
num.erase(num.begin(), num.begin() + num.find_first_not_of('0')); //删除高位无用'0'
return num;
}
string sub(string num1, string num2)
{
string num(1000, '0');
if(num1.empty() || num2.empty())
{
num = "Data error!";
return num;
}
int i, flag = 0;
if(num1.find_first_not_of('0') == string::npos)
num1 = '0';
else
num1.erase(num1.begin(), num1.begin() + num1.find_first_not_of('0'));
if(num2.find_first_not_of('0') == string::npos)
num2 = '0';
else
num2.erase(num2.begin(), num2.begin() + num2.find_first_not_of('0'));
if(num2.size() > num1.size()) //删除掉高位'0'后比较大小
flag = 1;
else if(num2.size() == num1.size())
{
cout << "I'm here." << endl;
if(num1 == num2)
{
num = '0';
return num;
}
flag = num2 > num1;
cout << flag << endl;
}
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
if(flag == 0)
{
for(i = 0; i < num1.size(); ++i)
num[i] = num1[i];
for(i = 0; i < num2.size(); ++i)
{
num[i] = num[i] - num2[i] + '0';
if(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
while(num[i] < '0') //处理余下的借位,因为以上循环中i只到num2.size()
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
else
{
for(i = 0; i < num2.size(); ++i)
num[i] = num2[i];
for(i = 0; i < num1.size(); ++i)
{
num[i] = num[i] - num1[i] + '0';
if(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
while(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
reverse(num.begin(), num.end());
if(num.find_first_not_of('0') == string::npos)
num = '0';
else
num.erase(num.begin(), num.begin() + num.find_first_not_of('0'));
if(flag == 1)
num.insert(0, "-");
return num;
}
string num(1000, '0');
if(num1.empty() || num2.empty())
{
num = "Data error!";
return num;
}
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int i, len;
for(i = 0; i < num1.size(); ++i)
num[i] = num1[i];
for(i = 0; i < num2.size(); ++i)
num[i] = num[i] - '0' + num2[i];
len = max(num1.size(), num2.size()); //len取最大确保处理完全部进位
for(i = 0; i < len; ++i)
{
num[i + 1] = num[i + 1] + (num[i] - '0') / 10;
num[i] = (num[i] - '0') % 10 + '0';
}
reverse(num.begin(), num.end());
if(num.find_first_not_of('0') == string::npos)
num = '0';
else
num.erase(num.begin(), num.begin() + num.find_first_not_of('0')); //删除高位无用'0'
return num;
}
string sub(string num1, string num2)
{
string num(1000, '0');
if(num1.empty() || num2.empty())
{
num = "Data error!";
return num;
}
int i, flag = 0;
if(num1.find_first_not_of('0') == string::npos)
num1 = '0';
else
num1.erase(num1.begin(), num1.begin() + num1.find_first_not_of('0'));
if(num2.find_first_not_of('0') == string::npos)
num2 = '0';
else
num2.erase(num2.begin(), num2.begin() + num2.find_first_not_of('0'));
if(num2.size() > num1.size()) //删除掉高位'0'后比较大小
flag = 1;
else if(num2.size() == num1.size())
{
cout << "I'm here." << endl;
if(num1 == num2)
{
num = '0';
return num;
}
flag = num2 > num1;
cout << flag << endl;
}
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
if(flag == 0)
{
for(i = 0; i < num1.size(); ++i)
num[i] = num1[i];
for(i = 0; i < num2.size(); ++i)
{
num[i] = num[i] - num2[i] + '0';
if(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
while(num[i] < '0') //处理余下的借位,因为以上循环中i只到num2.size()
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
else
{
for(i = 0; i < num2.size(); ++i)
num[i] = num2[i];
for(i = 0; i < num1.size(); ++i)
{
num[i] = num[i] - num1[i] + '0';
if(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
while(num[i] < '0')
{
num[i] = num[i] + 10;
num[i + 1] = num[i + 1] - 1;
}
}
reverse(num.begin(), num.end());
if(num.find_first_not_of('0') == string::npos)
num = '0';
else
num.erase(num.begin(), num.begin() + num.find_first_not_of('0'));
if(flag == 1)
num.insert(0, "-");
return num;
}
太复杂了,上周弄得,现在细节已经记不清了,还是用java的大数模板和高精度模板写吧。
阅读全文
0 0
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数 模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 统计字符(STL库使用)
- Android Studio3.0以下版本配置Kotlin
- 百度MIP-学习地址
- -(void)viewWillAppear:(BOOL)animated,- (void)viewDidLoad 的区别。
- jackson处理json,后台大写到前台变小写
- 大数模板
- NSRunLoop探究
- bzoj3159 -- LCT
- spring中配置定时任务
- 雷达图?蜘蛛图?又一个数据图表可以拿来使了!
- NDArray Tutorial
- 树欲静而风不止
- MongoDB学习笔记
- java中synchronized关键字的用法