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;
}