高精度

1.高精度加法(高精度加高精度)

#include<iostream>
#include<cstring>
#define maxn 10000001
using namespace std;
int a[maxn],b[maxn];
int c[maxn];
int lena,lenb;
int main()
{
    string a1,b1;
    cin>>a1>>b1;
    lena=a1.length();
    lenb=b1.length();
    //倒序存放在a,b数组中 
    for(int i=0;i<lena;i++){
        a[i]=a1[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        b[i]=b1[lenb-i-1]-'0';
    }
    int m=0;
    if(lena>=lenb){
        for(int i=0;i<lena;i++){
            int f=a[i];
            a[i]=(b[i]+a[i]+m)%10;
            m=(f+b[i]+m)/10;
        }
        if(m){//进位 
            a[lena]=m;
            lena++;
        } 
        for(int i=lena-1;i>=0;i--){
            cout<<a[i];
        }
    }else{
        for(int i=0;i<lenb;i++){
            int f=b[i];
            b[i]=(b[i]+a[i]+m)%10;
            m=(f+a[i]+m)/10;
        }
        if(m){
            b[lenb]=m;
            lenb++;
        } 
        for(int i=lenb-1;i>=0;i--){
            cout<<b[i];
        }
        
    }
    


}

 

2.高精度乘法

#include<iostream>
#include<cstring> 
#define maxn 10000001
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[maxn];
using namespace std;
int main()
{

    int lena,lenb,lenc;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>a1>>b1;
    lena=strlen(a1);
    lenb=strlen(b1);
    lenc=lena+lenb;
    for(int i=0;i<lena;i++){
        a[i]=a1[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        b[i]=b1[lenb-i-1]-'0';
    }
    
    for(int i=0;i<lena;i++){
        for(int j=0;j<lenb;j++){
            //i+j为乘法该位置上的数 
            c[i+j]=c[i+j]+(a[i]*b[j]);
            c[i+j+1]=c[i+j+1]+(c[i+j]/10);//进位 
            c[i+j]=c[i+j]%10; 
        }
    }
    int f=0,f1=0;
//    if(c[lenc-1]==0) lenc--;
    for(int i=lenc-1;i>=0;i--){
        if(c[i]!=0) f=1;
        if(f) 
        {
            cout<<c[i];
            f1=1;
        }
    }
    if(!f1) cout<<"0";


}

 

3.高精度乘单精度

#include<iostream>
#include<cstring>
#define maxn 10000001
int a[maxn];
using namespace std;
int main()
{
    //高精度a[]*单精度n;
    //单精度*单精度 
    int n;
    cin>>n; 
    memset(a,0,sizeof(a));
    a[1]=1;
    
    int p=1;//位数
    //求n的10次方 
    int i;
    for(int j=0;j<10;j++){
        int m=0;//进位 
        for(i=1;i<=p;i++){
            a[i]=a[i]*n+m;
            m=a[i]/10;
            a[i]=a[i]%10;    
        }
        //乘完之后还有进位 
        while(m>0){
            a[i]=m%10;
            m=m/10;
            i++;
        }
        p=i-1;
    }
    for(i=p;i>=1;i--){
        cout<<a[i];
    }


}

 

 

 

 

4.在题目中运用

洛古p1009

#include<iostream>
#include<cstring>
#define maxn 10000
using namespace std;
int a[maxn],s[maxn];
void pplus(int *a,int*s){
    int m=0;
    for(int i=1;i<=1000;i++){
        s[i]=s[i]+a[i]+m;
        m=s[i]/10;
        s[i]=s[i]%10;
    }
}
void cheng(int *a,int n){
    int m=0;//进位 
    for(int i=1;i<=1000;i++){
        //for表示运算次数,最后数长度 
        //*n为每次结束后a[]里存的是n-1的阶乘 
        a[i]=a[i]*n+m;
        m=a[i]/10;
        a[i]=a[i]%10;
    }
    
}

int main()
{
    int n;
    cin>>n;
    a[1]=1;
    memset(s,0,sizeof(s)); 
    for(int i=1;i<=n;i++){
        cheng(a,i);
        pplus(a,s);
    }
    int flag=0;
    for(int i=1000;i>=1;i--){
        if(s[i]!=0) flag=1;//去除开头0 
        if(flag) cout<<s[i];
         
    }
     


}

 

posted @ 2021-09-13 12:23  lwx_R  阅读(21)  评论(0编辑  收藏  举报