高精度计算c or c++篇

高精度求和

前述:

在各大OJ平台及比赛中经常会出现数值很大的加法运算,我们一般会首先尝试用long long代替int 的做法,(这也是好多次觉得代码没问题,但就是有些测试点过不去的原因,,所以,,OJ时一定要注意数据类型,double有时也是坑)。但数据更大的时候怎么办呢,就需要这篇博客的内容啦,ahhh.
下面写两个方法:1~用数组存储结果 2~用string类型的变量

2、下面直接用例题描述了啊,洛谷p1255数楼梯

例题

我懒,直接截图了,

3、

分析

每次可以走一阶或两阶,所以对于第n阶,我们不难推出f[n]=f[n-1]+f[n-2];类似斐波那契数列。但其实第n阶只与它前面的两个数有关,所以我们可以直接now=a+b;a=b;b=now;进行循环,没必要把所有数都存到数组中。
4、

数组存储求法


#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 5005;
int a[maxn], b[maxn], c[maxn];//前前一个数,前一个数,当前所求数
int n;
int main() {
 a[1] = 1;
 b[1] = 2;
 cin >> n;
 //特判
 if (n < 3) {
  cout << n << endl;
  return 0;
 }
 int lc = 1;//c的长度,因为a,b数组都是由c赋值过去的,所以这里可以用数组c的长度进行控制
 for (int i = 3; i <= n; ++i) {
  //注意每次要先清0.
  memset(c, 0, sizeof(c));
  //大数加法,实现c=a+b,a=b,b=c;的功能
  for (int j = 1; j <= lc; ++j) {
   c[j] += a[j] + b[j];
   c[j + 1] += c[j] / 10;
   c[j] %= 10;
  }
  //a= b; 
  if (c[lc + 1] > 0)++lc;
  for (int j = 1; j <= lc; ++j) {
   a[j] = b[j];
  }
  //b =c;
  for (int j = 1; j <= lc; j++) {
   b[j] = c[j];
  }
 }
 //输出最终结果
 for (int i = lc; i >= 1; i--) {
  cout << c[i];
 }
 return 0;
}

string存储求法

#include <iostream>
#include <string>
#include <algorihtm>
using namespace std;
string add_int(string_x, string _y)
{
  string x = _x, y = _y;//前前数值,前数值
  string result;//所求
  int jw = 0;//进位
 
  if(x.length() < y.length())     //保证y始终时是位数较短的数字字符串,为了之后用x的长度进行加法结束控制
    swap(x, y);
  int delta = x.length() - y.length();  //计算两个字符串的长度差
for(int i = 0; i < delta; i++)   //在较短的字符串前补0,使其长度等于较长的字符串的长度
y = "0" + y;
//从低位到高位进行运算
for(int i = x.length() - 1; i >= 0; i--)
  {
    int a, b ,sum;
    a = x[i] - '0';
    b = y[i] - '0';
    sum = a + b + jw;//第i位的和
    result += char(sum % 10 + '0');
    if(sum >= 10)
    {
      jw = 1;

    }
    else
    {
      jw = 0;
      
    }
  }
  //若循环结束后,仍有进位,说明结果超出了加数中较长的一个的位数,根据加法的法则,应在结果前面加“1”
if(jw == 1)
    result += "1";
  //反转结果。因为前面是从后往前运算,而字符串是从前往后加的,所以要反转一下
reverse(result.begin(), result.end());
  return result;
}
int main()
{
  string a, b;
  cin >> a >> b;
  cout << add_int(a, b);
  return 0;
}

5、

over

情况就是这么个情况,以后再遇到觉得代码没错,但就是有些测试点过不去的情况就得考虑一哈数据类型问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值