蓝桥杯:C++数组

本文介绍了在算法竞赛中数组的重要性和如何使用数组模拟其他数据结构,通过实例展示如何进行高精度加法(如100位整数相加)和阶乘计算(如1000!),展示了数组在处理大数和复杂计算中的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

数组是最简单的数据结构,虽然数组简单,但是在算法竞赛中至关重要,因为其他数据结构都可以用数组来模拟,即“物理存储上是数组,逻辑上是其他数据结构”。用数组模拟其他数据结构,虽然不是工程项目中的正规做法,但是非常适合算法竞赛,因为这样编写代码快、不易出错。

例题.高精度加法

【题目描述】输入两个整数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值