高精度算法
-
高精度加法
算法核心:
c[i]+=a[i]+b[i]; c[i+1]=c[i]/10; //进位到后一位; c[i]=c[i]%10 //一个位上不会出现大于等于10的数,大于等于10的部分已经进到后一位
#include<bits/stdc++.h>
using namespace std;
char s1[505],s2[505]; //¿É¼ÆËã10µÄ500´Î·½
int a[505],b[505],c[505];
int main(){
int lena,lenb,lenc;
cin>>s1>>s2;
lena=strlen(s1);
lenb=strlen(s2);
for(int i=0;i<lena;i++){
a[lena-i]=s1[i]-'0'; //½«×Ö·ûת»¯ÎªÊý×Ö£¬²¢ÇÒתÖÃ
}
for(int i=0;i<lenb;i++){
b[lenb-i]=s2[i]-'0';
}
lenc=max(lena,lenb)+1;
for(int i=1;i<=lenc;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[lenc]==0&&lenc>0) lenc--;//ɾ³ýÇ°µ¼0
for(int i=lenc;i>0;i--){
cout<<c[i]; //µ¹ÖÃÊä³ö
}
}
- 高精度乘法
#include<bits/stdc++.h>
using namespace std;
char s1[2005],s2[2005];
int a[2005],b[2005],c[2005];
int main(){
int lena,lenb,lenc;
cin>>s1>>s2;
lena=strlen(s1);
lenb=strlen(s2);
for(int i=0;i<lena;i++){
a[lena-i]=s1[i]-'0';
}
for(int i=0;i<lenb;i++){
b[lenb-i]=s2[i]-'0';
}
lenc=lena+lenb;
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[lenc]==0&&lenc>0) lenc--;
for(int i=lenc;i>0;i--){
cout<<c[i];
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x) //¸ß¾«¶ÈÇóij¸öÊýµÄ½×³Ë£¬²¢´æ·ÅÔÚÊý×é
{
int g=0;
for(int i=100;i>=0;i--)
{
a[i]=a[i]*x+g;
g=a[i]/10;
a[i]=a[i]%10;
}
}
void qh() //¸ß¾«¶ÈÇóºÍ
{
int g=0;
for(int i=100;i>=0;i--)
{
s[i]=s[i]+a[i]+g;
g=s[i]/10;
s[i]=s[i]%10;
}
}
void sc()
{
int w;
for(int i=0;i<=100;i++)
{
if(s[i]!=0)
{
w=i;
break;
}
}
for(int i=w;i<=100;i++)
printf("%d",s[i]);
}
int main()
{
scanf("%d",&n);
s[100]=a[100]=1;
for(int i=2;i<=n;i++)
{
change(i);
qh();
}
sc();
return 0;
}