大数模板

来源:互联网 发布:查看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;
}



太复杂了,上周弄得,现在细节已经记不清了,还是用java的大数模板和高精度模板写吧。

原创粉丝点击