[笔记]: 高精度 2017-05-22 10:27 36人阅读 评论(0) 收藏

总结:
关于高精度的计算 大体是一个套路
模拟小学所学的计算过程(竖式计算)
然后注意: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;
 }
原文地址:https://www.cnblogs.com/xljxlj/p/7183651.html