高精度

1.高精度加法

#include<iostream>
#include<cstring>
#define maxn 500
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> 
using namespace std;
int main()
{
    char a1[100],b1[100];
    int a[100],b[100],c[10000],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; 
        }
    }
    if(c[lenc-1]==0) lenc--;
    for(int i=lenc-1;i>=0;i--){
        cout<<c[i];
    }


}

3.在题目中运用

洛古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];
         
    }
     


}

 

上一篇:JQuery--1


下一篇:PAT basic 1034 有理数四则运算 (20 分) C++