总结:
关于高精度的计算 大体是一个套路
模拟小学所学的计算过程(竖式计算)
然后注意:1.进位 2.排除前导零
2的乘方
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[3010],b[3010],ans[10000];
int main()
{
int n,wei=1;
cin>>n;
a[1]=2;
while(n>1)
{
for(int i=1;i<=wei;i++)
{
a[i]=a[i]*2;
}
int i=1;
while(a[i]>10)
{
if(i==wei) wei++;
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
i++;
}
n--;
}
for(int j=wei;j>=1;j--)
{
cout<<a[j];
}
return 0;
}
高精加法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
char s[3010];
char t[3010];
int a[3010],b[3010];
int main()
{
int la,lb,len;
gets(s);
gets(t);
la=strlen(s);
lb=strlen(t);
if(la>lb) len=la;
else len=lb;
for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
for(int i=1;i<=len;i++) a[i]+=b[i];
for(int i=1;i<=len;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
if(a[len+1]>0) len++;
while(a[len]==0&&len>1) len--;
for(int i=len;i>=1;i--) cout<<a[i];
return 0;
}
高精减法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
char s[3010];
char t[3010];
int a[3010],b[3010];
int main()
{
int la,lb,lena,lenb;
gets(s);
gets(t);
lena=strlen(s);
lenb=strlen(t);
la=lena;lb=lenb;
for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
if(lena>lenb||strcmp(s,t)>0&&la==lb){
for(int i=1;i<=la;i++) {
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[la]==0&&la>1) la--;
for(int i=la;i>=1;i--) cout<<a[i];
}
if(lena<lenb||strcmp(s,t)<0&&la==lb){
for(int i=1;i<=lb;i++) {
if(b[i]<a[i]){
b[i+1]--;
b[i]+=10;
}
b[i]-=a[i];
}
while(b[lb]==0&&lb>1) lb--;
for(int i=lb;i>=1;i--) cout<<b[i];
}
return 0;
}
实数加法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
char s[3010];
char t[3010];
int a[3010],b[3010];
int c[3010],d[3010];
int main()
{
int la,lb,len;
bool flag=0;
gets(s);
gets(t);
la=strlen(s);
lb=strlen(t);
int lena,lenb;
for(int i=1;i<=la;i++){
if(s[i]=='.')
lena=i;
}
for(int i=1;i<=lb;i++){
if(t[i]=='.')
lenb=i;
}
//for(int i=len;i>=1;i--) cout<<a[i];整数部分
//for(int i=lena+1;i<=la-1;i++) c[i-lena]=s[i]-48;
//for(int i=lenb+1;i<=lb-1;i++) d[i-lenb]=t[i]-48;
int lla=la-lena-1;
int llb=lb-lenb-1;
int llen=max(lla,llb);
for(int i=llen+lena;i>=lena+1;i--) {
if(s[i]>='0'&&s[i]<='9')
c[lena+llen+1-i]=s[i]-48;
}
for(int i=llen+lenb;i>=lenb+1;i--) {
if(t[i]>='0'&&t[i]<='9')
d[lenb+llen+1-i]=t[i]-48;
}
for(int i=1;i<=llen;i++) c[i]+=d[i];
for(int i=1;i<=llen;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(c[llen+1]>0) flag=1;
int p=1;
while(c[p]==0){
p++;
}
len=max(lena,lenb);
for(int i=0;i<=lena-1;i++) a[lena-i]=s[i]-48;
for(int i=0;i<=lenb-1;i++) b[lenb-i]=t[i]-48;
if(flag==1) a[1]++;
for(int i=1;i<=len;i++) a[i]+=b[i];
for(int i=1;i<=len;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
if(a[len+1]>0) len++;
while(a[len]==0&&len>1) len--;
//for(int i=llen;i>=p;i--)
// cout<<c[i];
for(int i=len;i>=1;i--) cout<<a[i];
cout<<".";
for(int i=llen;i>=p;i--) cout<<c[i];
return 0;
}
高精度乘单精度
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[3010];
char b[3010];
int main()
{
int n,len=1;
gets(b);
len=strlen(b);
cin>>n;
for(int i=0;i<=len-1;i++)
{
a[i]=b[i]-48;
}
for(int i=0;i<=len-1;i++) a[i]*=n;
for(int i=0;i<=len-1;i++)
{
a[i+1]+=a[i]/10;
a[i]%=10;
}
int t=a[len];
while(t>0) {
len++;
a[len]=t%10;
t/=10;
}
while(a[len]==0&&len>1) len--;
for(int i=len-1;i>=0;i--)
{
cout<<a[i];
}
return 0;
}
高精度乘高精度
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int a[1000],b[1000],c[1000],d[1000];
char s[1000],t[1000];
int la,lb,len;
bool judge()
{
for(int i=len;i>=1;i--)
{
if(d[i]<b[i]) return false;
else if(d[i]>b[i]) return true;
}
return true;
}
void jian()
{
for(int i=1;i<=len;i++) {
if(d[i]<b[i]){
d[i+1]--;
d[i]+=10;
}
d[i]-=b[i];
}
}
void cheng()
{
for(int i=1;i<=len;i++) d[i]*=10;
for(int i=1;i<=len;i++)
{
d[i+1]+=d[i]/10;
d[i]%=10;
}
int t=d[len+1];
while(t>0) {
len++;
d[len]=t%10;
t/=10;
}
}
int main(){
gets(s);gets(t);
la=strlen(s);lb=strlen(t);
for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
len=la;
for(int i=len;i>=1;i--)
{
d[1]=a[i];
while(judge())
{
c[i]++;
jian();
}
cheng();
}
while(c[len]==0&&len>1)len--;
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
高精度除单精度
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
char s[3010];
char t[3010];
int a[3010],b[3010],c[3010];
int main()
{
int len,n,t=0;
gets(s);
len=strlen(s);
for(int i=0;i<=len-1;i++) a[len-i]=s[i]-48;
cin>>n;
for(int i=len;i>=1;i--)
{
t=t*10+a[i];
b[i]=t/n;
t%=n;
}
while(b[len]==0&&len>1) len--;
for(int i=len;i>=1;i--)
{
cout<<b[i];
}
return 0;
}
高精度除高精度(最难)
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int a[1000],b[1000],c[1000],d[1000];
char s[1000],t[1000];
int la,lb,len;
bool judge()//判断大小的函数
{
for(int i=len;i>=1;i--)
{
if(d[i]<b[i]) return false;
else if(d[i]>b[i]) return true;
}
return true;
}
void jian()//高精度减法
{
for(int i=1;i<=len;i++) {
if(d[i]<b[i]){
d[i+1]--;
d[i]+=10;
}
d[i]-=b[i];
}
}
void cheng()//高精度乘法 乘10(做除法时的计算)
{
for(int i=1;i<=len;i++) d[i]*=10;
for(int i=1;i<=len;i++)
{
d[i+1]+=d[i]/10;
d[i]%=10;
}
int t=d[len+1];
while(t>0) {
len++;
d[len]=t%10;
t/=10;
}
}
int main(){
gets(s);gets(t);
la=strlen(s);lb=strlen(t);
for(int i=0;i<=la-1;i++) a[la-i]=s[i]-48;
for(int i=0;i<=lb-1;i++) b[lb-i]=t[i]-48;
len=la;
for(int i=len;i>=1;i--)
{
d[1]=a[i];
while(judge())
{
c[i]++;
jian();
}
cheng();
}
while(c[len]==0&&len>1)len--;
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}