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

    高精度计算和竖式计算没什么区别,但由于数据很大需要用字符串读入所以过程中可能会有一些小问题。高精度算是学oi的基本知识所以直接上我的优(chou)美(lou)代码。

    高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。--百度百科

    高精度加法(洛谷P1601

    题目描述

    高精度加法,x相当于a+b problem,不用考虑负数。

    输入输出格式

    输入格式:

    分两行输入a,b<=10^500

    输出格式:

    输出只有一行,代表A+B的值

    输入输出样例

    输入样例#1: 
    1
    1
    输出样例#1: 
    2
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<iostream>
    using namespace std;
    int n,k;
    char shu1[1001],shu2[1001];
    char c1[1001],c2[1001];
    char ans[1001];
    int main()
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        scanf("%s",shu1);
        scanf("%s",shu2);
        int n1=strlen(shu1);
        int n2=strlen(shu2);
        int js1=1,js2=1;
        for(int i=n1-1;i>=0;--i)
        {
            c1[js1]=shu1[i]-'0';
            js1++;
        }
        for(int i=n2-1;i>=0;--i)
        {
            c2[js2]=shu2[i]-'0';
            js2++;
        }
        int sum=1;
        js1--; js2--;
        while(sum<=js1||sum<=js2)
        {
            ans[sum]+=c1[sum]+c2[sum];
            if(ans[sum]>=10)
            {
                ans[sum]-=10;
                ans[sum+1]+=1;
            }
            sum++;
        }
        while(ans[sum]==0&&sum!=1) sum--;
        for(int i=sum;i>=1;--i)
            printf("%d",int(ans[i]));
        return 0;
    }
    高精加

     高精度减法(洛谷P2142

    题目描述

    高精度减法

    输入输出格式

    输入格式:

    两个整数a,b(第二个可能比第一个大)

    输出格式:

    结果(是负数要输出负号)

    输入输出样例

    输入样例#1: 
    2
    1
    输出样例#1: 
    1

    说明

    20%数据a,b在long long范围内

    100%数据0<a,b<=10的10000次方

    比较麻烦,稍微讲一讲。

    #include<cstdio>
    #include<cstring>
    #include<string>
    using namespace std;
    int n,k;
    char shu1_false[10001],shu2_false[10001];
    char shu1_true[10001],shu2_true[10001];
    char c1[10001],c2[10001];
    char ans[10001];
    int js1_false=0,js2_false=0;
    int main()
    {
        memset(c1,0,sizeof(c1));//初始化 
        memset(c2,0,sizeof(c2));//初始化 
        scanf("%s",shu1_false);//读入 
        scanf("%s",shu2_false);//读入 
        int n1_false=strlen(shu1_false),n2_false=strlen(shu2_false);//计算两个串的长度。
        if(n1_false==1&&shu1_false[0]=='0')
        {
            js1_false=1;
            shu1_true[0]='0';
        }
        if(n2_false==1&&shu2_false[0]=='0')
        {
            js2_false=1;
            shu2_true[0]='0';
        }//判断有数为0的情况。 
        bool bz1=0,bz2=0;
        for(int i=0;i<n1_false;++i)
        {
            if(bz1==0&&shu1_false[i]!='0') bz1=1;
            if(bz1==1)
            {
                shu1_true[js1_false]=shu1_false[i];
                js1_false++;
            }
        }
        js1_false--;
        for(int i=0;i<n2_false;++i)
        {
            if(bz2==0&&shu2_false[i]!='0') bz2=1;
            if(bz2==1)
            {
                shu2_true[js2_false]=shu2_false[i];
                js2_false++;
            }
        }
        js2_false--;//将两个串去除前导零并记下来。
        int js1_true=1,js2_true=1;
        int n1_true=strlen(shu1_true),n2_true=strlen(shu2_true);
        if(n2_true>n1_true||(n2_true==n1_true&&strcmp(shu1_true,shu2_true)<0))//判断两个串谁大谁小。 串一<串二时。 
        {
            printf("-");//输出﹣号。 
            for(int i=js2_false;i>=0;--i)
            {
                c1[js1_true]=shu2_true[i]-'0';
                js1_true++;
            }
            for(int i=js1_false;i>=0;--i)
            {
                c2[js2_true]=shu1_true[i]-'0';
                js2_true++;
            }//将第二个串存到c1, 第一个串存到c2 
        }
        else//大于的话。 
        {
            for(int i=js1_false;i>=0;--i)
            {
                c1[js1_true]=shu1_true[i]-'0';
                js1_true++;
            }
            for(int i=js2_false;i>=0;--i)
            {
                c2[js2_true]=shu2_true[i]-'0';
                js2_true++;
            }//将第一个串存到c1, 第二个串存到c2 
        }
        js1_true--; js2_true--;
        int sum=1;
        while(sum<=js1_true||sum<=js2_true)
        {
            if(c1[sum]<c2[sum])
            {
                c1[sum]+=10;
                c1[sum+1]-=1;
            }//借一 
            ans[sum]=c1[sum]-c2[sum];
            sum++;
        }//计算减法。 
        while(ans[sum]==0&&sum!=1) sum--;//去前导零。 
        for(int i=sum;i>=1;--i)//输出答案。 
            printf("%d",int(ans[i]));
        return 0;
    }
    高精度减法

     时隔13天,整整13天,我又来更新了!

    P1303 A*B Problem

    题目描述

    求两数的积。

    输入输出格式

    输入格式:

    两行,两个数。

    输出格式:

    输入输出样例

    输入样例#1: 
    1 
    2
    输出样例#1: 
    2

    说明

    每个数字不超过10^2000,需用高精

    Code(没处理负数):

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    char shu1[2020],shu2[2020];
    char c1[2020],c2[2020];
    char ans[5000];
    int len=0;
    int main()
    {
        memset(ans,0,sizeof(ans));
        int js1=1,js2=1;
        cin>>shu1>>shu2;
        int len1=strlen(shu1),len2=strlen(shu2);
        for(int i=len1-1;i>=0;--i)
            c1[js1++]=shu1[i]-'0';
        while(js1>1&&c1[js1]==0) js1--;
        for(int i=len2-1;i>=0;--i)
            c2[js2++]=shu2[i]-'0';
        while(js2>1&&c2[js2]==0) js2--;
        for(int i=1;i<=js1;++i)
        {
            int jw=0;
            for(int j=1;j<=js2;++j)
            {
                len=j+i-1;
                ans[j+i-1]+=c1[i]*c2[j];
                jw=ans[j+i-1]/10;
                ans[j+i-1]%=10;
                if(jw>0)
                {
                    ans[j+i]+=jw;
                    jw=0;
                    if(j+i>len) len=j+i;
                }
            }
        }
        while(len>1&&ans[len]==0) len--;
        for(int i=len;i>=1;--i)
            cout<<int(ans[i]);
        return 0;
    }
    高精乘
  • 相关阅读:
    Linux中杀不死的进程
    SQL语句 不支持日语 韩语 泰国语等的解决办法
    很长时间没写,重新开始每天进步一点点
    c#使用access数据库时 模糊查询 like 通配符的写法
    每天进步一点点之找工作的心路历程
    每天进步一点点之工作前三天
    Ajax实现原理
    java动态代理的原理
    css定位机制总结
    迷宫,较为高效的C++代码 BFS实现
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/10827841.html
Copyright © 2011-2022 走看看