day6-蓝桥(basic29、30)

BASIC-29. 高精度加法

问题描述
  输⼊入两个整数a和b,输出这两个整数的和。a和b都不不超过100位。
算法描述
  由于a和b都⽐比较⼤大,所以不不能直接使⽤用语⾔言中的标准数据类型来存储。对于这种问题,⼀一般使⽤用
数组来处理理。
  定义⼀一个数组A,A[0]⽤用于存储a的个位,A[1]⽤用于存储a的⼗十位,依此类推。同样可以⽤用⼀一个数组
B来存储b。
  计算c = a + b的时候,⾸首先将A[0]与B[0]相加,如果有进位产⽣生,则把进位(即和的⼗十位数)存⼊入
r,把和的个位数存⼊入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位
进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果⼜又有进位产⽣生,则仍可将新的进
位存⼊入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。
输⼊入格式
  输⼊入包括两⾏行行,第⼀一⾏行行为⼀一个⾮非负整数a,第⼆二⾏行行为⼀一个⾮非负整数b。两个整数都不不超过100位,
两数的最⾼高位都不不是0。
输出格式
  输出⼀一⾏行行,表示a + b的值。
样例例输⼊入
20100122201001221234567890
2010012220100122
样例例输出
20100122203011233454668012

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int a[100],b[100],c[101];
string s1,s2;
int r;
int j;
int main(){
	
	cin>>s1;
	cin>>s2;
	int lena=s1.length();
	int lenb=s2.length();
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	j=lena-1;
	for(int i=0;i<lena;i++)
	{
		
		a[i]=s1[j]-'0';
		j--; 
	}
	j=lenb-1;
	for(int i=0;i<lenb;i++)
	{
		
		b[i]=s2[j]-'0';
		j--; 
	}

	for(int i=0;i<100;i++)
	{
		r=0;
		if((a[i]+b[i])>=10)
		{
		c[i]=(a[i]+b[i])/10;
		r=(a[i]+b[i])%10;
	
		}else
			c[i]=a[i]+b[i]+r;
	}
	if(c[lena]!=0)
	lena++;
	for(int i=lena-1;i>=0;i--)
		cout<<c[i];
	
	
	
	
	return 0;
}

思考:
本题基础题
注意点:字符串到数组的迁移要有 -“0”
2、字符串获取长度:length()
数组获取长度:sizeof()
3、判断是否有进位

BASIC-30. 阶乘计算

问题描述
  输⼊入⼀一个正整数n,输出n!的值。
  其中n!=123*…*n。
算法描述
  n!可能很⼤大,⽽而计算机能表示的整数范围有限,需要使⽤用⾼高精度计算的⽅方法。使⽤用⼀一个数组A来表
示⼀一个⼤大整数a,A[0]表示a的个位,A[1]表示a的⼗十位,依次类推。
  将a乘以⼀一个整数k变为将数组A的每⼀一个元素都乘以k,请注意处理理相应的进位。
  ⾸首先将a设为1,然后乘2,乘3,当乘到n时,即得到了了n!的值。
输⼊入格式
  输⼊入包含⼀一个正整数n,n<=1000。
  输出格式
  输出n!的准确值。
样例例输⼊入
10
样例例输出
3628800

#include<iostream>
#include<cstring>
using namespace std;
int a[10000];
int main(){
	int n;
	cin>>n;
	memset(a,0,sizeof(a));
	a[0]={1};
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<10000;j++)
			a[j]=a[j]*i;
		for(int j=0;j<10000;j++)
		{
			if(a[j]>9)
			{
				a[j+1]=a[j+1]+a[j]/10;
				a[j]=a[j]%10;
				
				
			}
		}
	}
	int t;
	for(int i=9999;i>=0;i--)
	{
		if(a[i]!=0)
		{
			t=i;
			break;
		}
	}
	for(int i=t;i>=0;i--)
	{
		cout<<a[i];
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值