数组
数组是最简单的数据结构,虽然数组简单,但是在算法竞赛中至关重要,因为其他数据结构都可以用数组来模拟,即“物理存储上是数组,逻辑上是其他数据结构”。用数组模拟其他数据结构,虽然不是工程项目中的正规做法,但是非常适合算法竞赛,因为这样编写代码快、不易出错。
例题.高精度加法
【题目描述】输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
C++的数据类型中,最大的long long类型,可以声明64位的二进制数变量。此题的关键是处理大数的输入,因为整数a和b太大,无法将其直接赋值给C++的变量,所以不能按数字读入,只能按字符读入。
代码:
#include<iostream>
#include<string>
using namespace std;
int a[1010],b[1010],c[1010]; //两个加数及和
int lena,lenb,lenc,i;
void sumn(int a[],int b[]){
lenc=lena;
if(lena<lenb) lenc=lenb; //以较长数据为基准
for( i=0; i<lenc; i++){
c[i]=a[i]+b[i]+c[i]; //考虑进位
if(c[i]>=10){
c[i+1]=1; //需进位
c[i]=c[i]-10;
}
}
if(c[lenc]>0) lenc++; //处理最高位的进位
}
int main(){
string s1,s2; //两个加数
cin>>s1>>s2;
lena=s1.size();
lenb=s2.size();
for( i=0; i<lena; i++){ //字符倒序存入数组中
a[lena-i-1]=s1[i]-'0';
}
for( i=0; i<lenb; i++){
b[lenb-i-1]=s2[i]-'0';
}
//求和
sumn(a,b);
for( i=lenc-1; i>=0; i--){
cout<<c[i];
}
return 0;
}
例题.阶乘计算
【题目描述】输入一个正整数n,输出n!的值,n≤1000。
这是一道高精度算法题目,高精度算法可用数组实现。
数组a[]需要定义成多大?也就是说,1000!有多少位?可以用Windows自带的计算器直接算出来,1000! ≈4e2567。代码中简单地定义成一个更大的数组a[10000]。
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[10000]={1};
int length=1;
for(int i=1;i<=n;i++)
{
int p=0;
int carry=0; //进位标志
while(1)
{
int product=a[p]*i+carry; //从低位到高位模拟乘法的过程
a[p]=product%10;
carry=product/10;
p++;
if(a[p]==0&&carry==0&&p>=length) break; //多余0元素的排除——提前终止乘法运算
}
length=p; //length变量获取当前数值的长度
}
for(int i=length-1;i>=0;i--) cout<<a[i];
cout<<endl;
return 0;
}