专项复习1 高精度
高精度
1 高精度加法 LGP1601
啥也不说,直接上代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
char ans1[505],ans2[505];
int num1[505],num2[505],numans[510];
int len1,len2,lent;
int main(){
	scanf("%s\n%s",ans1+1,ans2+1);
	len1=strlen(ans1+1);
	len2=strlen(ans2+1);
	for(int i=1,j=len1;i<=len1;i++,j--){
		num1[i]=ans1[j]-'0';
	}
	for(int i=1,j=len2;i<=len2;i++,j--){
		num2[i]=ans2[j]-'0';
	}
	lent=max(len1,len2)+1;
	for(int i=1;i<=lent;i++){
		numans[i]=num1[i]+num2[i];
	}
	for(int i=1;i<=lent;i++){
		if(numans[i]>=10){
			numans[i+1]+=(numans[i]/10);
			numans[i]%=10;
		}
	}
	while(numans[lent]==0&&lent>1) lent--;
	for(int i=lent;i>=1;i--){
		printf("%d",numans[i]);
	}
	return 0;
}
2 数楼梯 LGP1255
题解
斐波那契数列+高精度,基本上没什么改动
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath> 
using namespace std;
int a[5001][1202];
int n;
//bool pd; 
int pd;
int main(){
	a[0][1]=0;
	a[1][1]=1;
	a[2][1]=2;
	scanf("%d",&n);
	for(int i=3;i<=n;i++){
		for(int j=1;j<1200;j++){
			a[i][j]=a[i-1][j]+a[i-2][j];
		}
		for(int j=1;j<1200;j++){
			while(a[i][j]>9){
				a[i][j+1]++;
				a[i][j]-=10;
			}
		}
	}
	for(int i=1200;i>1;i--){
		if(!pd&&a[n][i]==0) continue;
		pd=1;
		printf("%d",a[n][i]);
	}
	printf("%d",a[n][1]);
	return 0;
}
3 \(B\)进制星球 LGP1604
题解
其实就是一个万能的高精度,\(B\)进制就是逢\(B\)进1,以前的\(\mod 10\)、÷10都变成\(\mod B\),剩下的和高精度相同,注意字母和数字的转换(我用了两个函数)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int mod;
char ans1[2020],ans2[2020];
int num1[2020],num2[2020],numans[4050];
int len1,len2,lent;
int che(char s){
	if(s>='0'&&s<='9') return (s-'0');
	return (s-'A'+10);
}
char ret(int s){
	if(s>=0&&s<=9) return (s+'0');
	return('A'+s-10);
}
int main(){
	scanf("%d",&mod);
	scanf("%s\n%s",ans1+1,ans2+1);
	len1=strlen(ans1+1);
	len2=strlen(ans2+1);
	for(int i=1,j=len1;i<=len1;i++,j--){
		num1[i]=che(ans1[j]);
	}
	for(int i=1,j=len2;i<=len2;i++,j--){
		num2[i]=che(ans2[j]);
	}
	lent=max(len1,len2)+1;
	for(int i=1;i<=lent;i++){
		numans[i]=num1[i]+num2[i];
	}
	for(int i=1;i<=lent;i++){
		if(numans[i]>=mod){
			numans[i+1]+=(numans[i]/mod);
			numans[i]%=mod;
		}
	}
	while(numans[lent]==0&&lent>1) lent--;
	for(int i=lent;i>=1;i--){
		printf("%c",ret(numans[i]));
	}
	return 0;
}
    要做就做南波万

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号