zoukankan      html  css  js  c++  java
  • 高精度

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <cstdlib>
    #define N 2333
    #define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
    #define yxz(i , a , b) for(int i = a ; i >= b ; i --)
    #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
    #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
    using namespace std;
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans; 
    } 
    void put(int x) {
        if(x < 0) {
            putchar('-');
            x = -x;
        }
        if(x == 0) {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j;
    char s[N],s1[N],s2[N];
    int main()
    {
        freopen("bigadd.in","r",stdin);
        freopen("bigadd.out","w",stdout);
        scanf("%s",s1);
        scanf("%s",s2);
        n1 = strlen(s1);
        n2 = strlen(s2);
        for(i = 0 ; i < n1 ; i ++)
            a[i] = (int)s1[n1 - i - 1] - (int)'0';
        for(i = 0 ; i < n2 ; i ++)
            b[i] = (int)s2[n2 - i - 1] - (int)'0';
        for(i = 0 ; i < n1 ; i ++)
        {
            x = 0;
            c[i] += a[i] + b[i] + x;
            x = c[i] / 10;
            c[i] = c[i] % 10;
            c[i + 1] = x;
        }
        n3 = n1 + n2;
        while(c[n3] == 0 && n3 > 0) 
            n3--;
        yxz(i , n3 , 0)
            put(c[i]);
        return 0;
    }

    emmm……在循环加法的时候只循环了第一位数,所以只要有第二个数的位数大于第一个就j了。23333

     另一种高精度加法:

    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    struct node//定义一个结构体,用来储存一个数的位数和每一位上的数
    {
        int len,a[1000];
        node()//初始化结构体
        {
            len=0;
            memset(a,0,sizeof(a));
        }
    };
    node jiafa(node n1,node n2)//定义新的函数“jiafa”,用来进行高精度计算
    {
    //初始化    
      node n0;
        n0.len=max(n1.len,n2.len);//n0的长度一定是大于等于最长的那个位数,所以要初始为这个值
    //模拟加法,但先不进位
        for(int i=1;i<=n0.len;i++)
            n0.a[i]=n1.a[i]+n2.a[i];
    //加完了,统一进位
        for(int i=1;i<=n0.len;i++)
        {
            n0.a[i+1]+=n0.a[i]/10;
            n0.a[i]%=10;
        }
    //研究最高位是哪位
        int i=n0.len;
        while(n0.a[i+1]>0)
        {
            i++;
            n0.a[i+1]+=n0.a[i]/10;
            n0.a[i]%=10;
        }
        while((n0.a[i]==0)&&(i>1))
            i--;
        n0.len=i;
        return n0;
    }
    int main()
    {
        char st[1010];
        node n1,n2,n0;
        scanf("%s",st+1);//输入字符串,从第一个位置开始存
        n1.len=strlen(st+1);//
        for(int i=1;i<=n1.len;i++)//降序排列放入数组,便于进位
            n1.a[n1.len-i+1]=st[i]-'0';    
        scanf("%s",st+1);
        n2.len=strlen(st+1);
        for(int i=1;i<=n2.len;i++)
            n2.a[n2.len-i+1]=st[i]-'0';    
        n0=jiafa(n1,n2);
        for(int i=n0.len;i>=1;i--)//反着输出,因为是降序存入
            printf("%d",n0.a[i]);
        return 0;
    }
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <cstdlib>
    #define N 2333
    #define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
    #define yxz(i , a , b) for(int i = a ; i >= b ; i --)
    #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
    #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
    using namespace std;
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans; 
    } 
    void put(int x) {
        if(x < 0) {
            putchar('-');
            x = -x;
        }
        if(x == 0) {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j;
    char s[N],s1[N],s2[N];
    int main()
    {
        freopen("test.in","r",stdin);
        freopen("test.out","w",stdout);
        scanf("%s",s1);
        scanf("%s",s2);
        n1 = strlen(s1);
        n2 = strlen(s2);
        for(i = 0 ; i < n1 ; i ++)
            a[i] = (int)s1[n1 - i - 1] - (int)'0';
        for(i = 0 ; i < n2 ; i ++)
            b[i] = (int)s2[n2 - i - 1] - (int)'0';
        for(i = 0 ; i < n1 ; i ++)
        {
            if(a[i] < b[i])
                a[i] += 10,a[i + 1] = a[i + 1] - 1;
            c[i] = a[i] - b[i];
        }
        n3 = n1 + n2;
        while(c[n3] == 0 && n3 > 0) 
            n3--;
        yxz(i , n3 , 0)
            put(c[i]);
        return 0;
    }

    这个高精度减法是删减版,有负数的情况还没判断,所以只要判断一下就行:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <cstdlib>
    #include <string> 
    #define N 2333
    #define zxy(i , a , b) for(int i = a ; i <= b ; i ++)
    #define yxz(i , a , b) for(int i = a ; i >= b ; i --)
    #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++)
    #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --)
    using namespace std;
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans; 
    } 
    void put(int x) {
        if(x < 0) {
            putchar('-');
            x = -x;
        }
        if(x == 0) {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    char sa[N],sb[N]; 
    int a[N],b[N],c[N]; 
    int alen,blen,clen,i,j; 
    int cmp(string a,string b)
    {
        if(strlen(sa)>strlen(sb))return 1;
        else if(strlen(sa)<strlen(sb))return -1;
        else
        {
            int i,l=strlen(sa);
            for(i=0;i<l;i++)
            {
                if(sa[i]>sb[i])return 1;
                else if(sa[i]<sb[i])return -1;
            }
        }
        return 0;
    }
    int main() 
    { 
        cin>>sa>>sb; 
        if(cmp(sa,sb)==0)
        {
            put(0);
            return 0;
        }
        else if(cmp(sa,sb)==-1)
        {
            cout<<'-';
            char t[N];
            strcpy(t,sa);
            strcpy(sa,sb);
            strcpy(sb,t);
        }
        alen=strlen(sa); 
        blen=strlen(sb); 
        clen=max(alen,blen); 
        for(i=0;i<alen;i++) 
            a[alen-i]=sa[i]-'0'; 
        for(i=0;i<blen;i++)
            b[blen-i]=sb[i]-'0'; 
        for(i=1;i<=clen;i++)
            c[i]=a[i]-b[i];
        for(i=1;i<=clen;i++)
            if(c[i]<0)
                c[i]+=10,c[i+1]--;
        while(c[clen]==0&&clen>1)clen--;
        for(i=clen;i>=1;i--) 
            put(c[i]); 
        cout<<endl; 
    }

    高精度乘法,很简单。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <cmath>
    #include <cstdlib>
    using namespace std;
    #define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
    #define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
    #define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
    #define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
    #define N 2333
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans;
    }
    void put(int x)
    {
        if(x < 0)
        {
            putchar('-');
            x = -x;
        }
        if(x == 0)
        {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    int a[N],b[N],c[N];
    char s1[N],s2[N];
    int main ()
    {
        int n1 , n2 , n3 , x , i , j;
        scanf("%s",s1);
        scanf("%s",s2);
        n1 = strlen(s1);
        n2 = strlen(s2);
        for(i = 0 ; i < n1 ; i ++)
            a[i] = (int)s1[n1 - i - 1] - (int)'0';
        for(i = 0 ; i < n2 ; i ++)
            b[i] = (int)s2[n2 - i - 1] - (int)'0';
        for(i = 0 ; i < n1 ; i ++)
        {
            x = 0;
            for(j = 0 ; j < n2 ; j ++)
            {
                c[i + j] += a[i] * b[j] + x;
                x = c[i + j] / 10;
                c[i + j] = c[i + j] % 10;
            }
            c[i + j] = x;
        }
        n3 = n2 + n1;
        while(c[n3] == 0 && n3 > 0) 
            n3--;
        yxz(i , n3 , 0)
            put(c[i]);
        return 0;
    }

    高精度阶乘,也很简单。‘

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <cmath>
    #include <cstdlib>
    using namespace std;
    #define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
    #define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
    #define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
    #define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
    #define N 2333
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans;
    }
    void put(int x)
    {
        if(x < 0)
        {
            putchar('-');
            x = -x;
        }
        if(x == 0)
        {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    int a[N],b[N];
    int main ()
    {
        int n,t,i,j,k;
        n = read();
        a[1] = 1;
        for (i = 1 ; i <= n ; i ++)
        {
                for (j = 1 ; j <= 1001 ; j ++)
                    a[j] *= i;
                for (k = 1 ; k <= 1001 ; k ++)
                {
                    a[k + 1] += a[k] / 10;
                    a[k] %= 10;
                }
        }
        i = 1001;
        while (a[i] == 0) 
            i--;
        for (j = i ; j >= 1 ; j--)
            put(a[j]);
        return 0;
    }

    高精度除法:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <cmath>
    #include <cstdlib>
    using namespace std;
    #define zxy(i , a , b)    for(int i = a ; i <= b ; i ++)
    #define zxyzxy(i , a , b)    for(int i = a ; i < b ; i ++)
    #define yxz(i , a , b)    for(int i = a ; i >= b ; i --)
    #define yxzyxz(i , a , b)    for(int i = a ; i > b ; i --)
    #define N 2333
    int read()
    {
        int ans = 0;
        char ch = getchar(),last = ' ';
        while(ch < '0' || ch > '9')
            last = ch , ch = getchar();
        while(ch >= '0' && ch <= '9')
            ans = ans * 10 +ch - '0' , ch = getchar();
        if(last == '-')
            ans = -ans;
        return ans;
    }
    void put(int x)
    {
        if(x < 0)
        {
            putchar('-');
            x = -x;
        }
        if(x == 0)
        {
            putchar('0');
            return;
        }
        int q[100] , nn = 0;
        while(x)
            q[++ nn] = x % 10 , x /= 10;
        while(nn)
            putchar('0' + q[nn]), --nn;
    }
    //函数SubStract功能:
    //用长度为len1的大整数p1减去长度为len2的大整数p2
    // 结果存在p1中,返回值代表结果的长度
    //不够减 返回-1 正好够 返回0
    int SubStract( int *p1, int *p2, int len1, int len2 )
    {
        int i;
        if( len1 < len2 )
            return -1;
        if( len1 == len2 )
        {
            //判断p1 > p2
            for( i = len1 - 1 ; i >= 0 ; i-- )
            {
                if( p1[i] > p2[i] )   //若大,则满足条件,可做减法
                    break;
                else if( p1[i] < p2[i] ) //否则返回-1
                    return -1;
            }
        }
        for( i = 0 ; i <= len1 - 1 ; i++ )   //从低位开始做减法
        {
            p1[i] -= p2[i];
            if( p1[i] < 0 )          //若p1<0,则需要借位
            {
                p1[i] += 10;         //借1当10
                p1[i+1]--;           //高位减1
            }
        }
        for( i = len1 - 1 ; i >= 0 ; i-- )       //查找结果的最高位
            if( p1[i] )                  //最高位第一个不为0
                return (i+1);       //得到位数并返回
        return 0;                  //两数相等的时候返回0
    }
    int main()
    {
        int n, k, i, j;             //n:测试数据组数
        int len1, len2;             //大数位数
        int nTimes;                 //两大数相差位数
        int nTemp;                  //Subtract函数返回值
        int num_a[N];          //被除数
        int num_b[N];          //除数
        int num_c[N];          //
        char str1[N + 1];      //读入的第一个大数
        char str2[N + 1];      //读入的第二个大数
        n = read();
        while ( n-- > 0 )
        {
            scanf("%s", str1);        //以字符串形式读入大数
            scanf("%s", str2);
            for ( i = 0 ; i < N ; i++ )   //初始化清0
            {
                num_a[i] = 0;
                num_b[i] = 0;
                num_c[i] = 0;
            }
            len1 = strlen(str1);  //获得大数的位数
            len2 = strlen(str2);
            for( j = 0 , i = len1 - 1 ; i >= 0 ; j++ , i-- )
                num_a[j] = str1[i] - '0';  //将字符串转换成对应的整数,颠倒存储
            for( j = 0 , i = len2 - 1 ; i >= 0 ; j++ , i-- )
                num_b[j] = str2[i] - '0';
            if( len1 < len2 )   //如果被除数小于除数,结果为0
            {
                printf("0
    ");
                continue;   //利用continue直接跳出本次循环。 进入下一组测试
            }
            nTimes = len1 - len2;    //相差位数
            for ( i = len1 - 1 ; i >= 0 ; i-- )    //将除数扩大,使得除数和被除数位数相等
            {
                if ( i >= nTimes )
                    num_b[i] = num_b[i - nTimes];
                else                     //低位置0
                    num_b[i] = 0;
            }
            len2 = len1;
            for( j = 0 ; j <= nTimes ; j++ )      //重复调用,同时记录减成功的次数,即为商
            {
                while((nTemp = SubStract(num_a,num_b + j,len1,len2 - j)) >= 0)
                {
                    len1 = nTemp;      //结果长度
                    num_c[nTimes - j]++;//每成功减一次,将商的相应位加1
                }
            }
            //输出结果
            for( i = N-1 ; num_c[i] == 0 && i >= 0 ; i-- );//跳过高位0
            if( i >= 0 )
                for( ; i >= 0 ; i-- )
                    printf("%d", num_c[i]);
            else
                printf("0");
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    alpine python3中使用mysql报错ModuleNotFoundError: No module named 'MySQLdb'
    Galera集群部署
    Kibana did not load properly.Check the server output for more information。
    zabbix-server迁移
    traefik使用etcd存储配置
    Rancher2.4搭建单机版rabbitmq
    ngx_http_upstream_module模块说明
    【说明】
    运维日常集合(个人向 坚持更新)
    Linux监控-历史细项数据回溯
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8525177.html
Copyright © 2011-2022 走看看