高精度求和
前述:
在各大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
情况就是这么个情况,以后再遇到觉得代码没错,但就是有些测试点过不去的情况就得考虑一哈数据类型问题