数组
数组是最简单的数据结构,虽然数组简单,但是在算法竞赛中至关重要,因为其他数据结构都可以用数组来模拟,即“物理存储上是数组,逻辑上是其他数据结构”。用数组模拟其他数据结构,虽然不是工程项目中的正规做法,但是非常适合算法竞赛,因为这样编写代码快、不易出错。
例题.高精度加法
【题目描述】输入两个整数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;
}