大数模板

本文介绍了使用C++中的字符串类型实现大数加法和减法的方法。通过反转字符串、逐位进行数值运算并处理进位和借位等方式,实现了大数的精确计算。文章还讨论了一些特殊情况的处理,如数据验证、去除前导零等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    大数思路简单,实现起来比较复杂,考虑的情况比较多。

    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的大数模板和高精度模板写吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值