1.相关概念及解析
大数:
大数:指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。
例如:
1.求Fibonacci数列的第1000个数。
2.计算π到小数点后第2000位。
现有基本数据类型存不下,无法计算。。。。
解决方法:
- 一般是用数组模拟大数的运算
- 开一个比较大的整型数组
- 数组的元素代表大数的某一位
- 通过数组元素的运算模拟大数的运算
- 最后将代表大数的数组输出
总结:该问题属于模拟题。用一个数组保存一个数字的每一位,如何模拟加减的竖式运算。
遇见的问题:
1.数据的输入方法和存储方法
输入:字符串 存储:数组
2.大整数位数的确定
字符串长度
3.模拟过程:进位,借位处理
数据的输入:
//方法1:
c[i] = a[i] +b[i] + x ;
if (c[i] >= 10) {
//用x记录进位的值
}
//方法2:
c[i] = a[i] +b[i] ;
if (c[i] >= 10) {
c[i + 1]++;
}
减法需要注意:
- a与b之间的大小关系未知,结果可能为负!
- 结果中前置位存在很多的0
思考-->
1006 – 1000 = 6(right)
1006 – 1000 = 0006(wrong)
减法分析:
1. a与b之间的大小关系未知,结果可能为负
- 先对a和b进行大小关系的判断,保证a > b进行a – b的减法过程。
- 判断过程中自行根据情况打印负号。
- 选择合理的对象进行大小判断,和相应的数字转换存储。
2. 结果中前置位存在很多的0
- 输出前先进行前置位多余0的过滤。
- (00060789)98706000--->找到第一个非零的数值,开始输出结果
代码:
加法:
#include<iostream>
#include<string>
using namespace std;
int a[505],b[505],c[505];
int init(int a[])
{
string s;
cin>>s;
int len=s.size();
for(int i=0;i<len;i++)
a[i]=s[len-1-i]-'0';
return len;
}
int main()
{
int lena=init(a);
int lenb=init(b);
int lenc=max(lena,lenb);
for(int i=0;i<lenc;i++)
{
c[i]+=a[i]+b[i];
if(c[i]>=10)
{
c[i+1]++;
c[i]%=10;
}
}
while(c[lenc]==0 && lenc>0)
lenc--;
for(int i=lenc;i>=0;i--)
cout<<c[i];
return 0;
}
减法:
#include<iostream>
#include<string>
using namespace std;
int a[11000],b[11000],c[11000];
int init(int a[],string &s)
{
cin>>s;
int len=s.size();
for(int i=0;i<len;i++)
a[i]=s[len-1-i]-'0';
return len;
}
int main()
{
string s1,s2;
int lena=init(a,s1);
int lenb=init(b,s2);
int lenc=max(lena,lenb);
if(lena<lenb || (lena==lenb && s1<s2))
{
swap(a,b);
cout<<"-";
}
for(int i=0;i<lenc;i++)
{
c[i]+=a[i]-b[i];
if(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
lenc--;
while(c[lenc]==0 && lenc>0)
lenc--;
for(int i=lenc;i>=0;i--)
cout<<c[i];
return 0;
}