高精度
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;
}
原文地址:https://www.cnblogs.com/liuziwen0224/p/fuxi1.html
时间: 2024-10-11 01:11:33