【多题合集】高精度加减乘除

来源:互联网 发布:php 异步执行函数 编辑:程序博客网 时间:2024/05/21 17:30

高端:高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
自言自语:oi生涯最恨高精度和字符串,代码打的也非常脑残,所以╮(╯▽╰)╭……
——————————————————————————————————————————————
3116 高精度练习之加法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。

输入描述 Input Description
读入两个用空格隔开的正整数

输出描述 Output Description
输出A+B的值

样例输入 Sample Input
3 12

样例输出 Sample Output
15

数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int main(){    char d[502],e[502];    int a[502],c[502];    int b[502];    int ss=0,hh=0;    cin>>d;    cin>>e; int l1=strlen(d),l2=strlen(e),i,x;    for (i=0;i<=l1-1;i++) a[i]=d[i]-'0';    for (i=0;i<=l2-1;i++) b[i]=e[i]-'0';    //字符串转化数字     if (l1>=l2)    {        for (i=0;i<=l1-l2-1;i++) c[i]=0;        for (i=l1-l2;i<=l1-1;i++) c[i]=b[l2-l1+i];    }     else     {        for (i=0;i<=l2-l1-1;i++) c[i]=0;        for (i=l2-l1;i<=l2-1;i++) c[i]=a[l1-l2+i];    }       //补零     x=max(l1,l2);    if (l1>=l2) {for (i=x-1;i>=1;i--)    {b[i]=a[i]+c[i];    if (b[i]>=10)    {        b[i]-=10;        c[i-1]++;    }}    if (a[0]+c[0]>=10)    {        b[0]=a[0]+c[0]-10;        cout<<1;    }    else b[0]=a[0]+c[0];    for (i=0;i<=x-1;i++) cout<<b[i];}    //++(a长)     else {for (i=x-1;i>=1;i--)    {a[i]=b[i]+c[i];    if (a[i]>=10)    {        a[i]-=10;        c[i-1]++;    }}    if (b[0]+c[0]>=10)    {        a[0]=b[0]+c[0]-10;        cout<<1;    }    else a[0]=b[0]+c[0];    for (i=0;i<=x-1;i++) cout<<a[i];}    //++(b长) }

3115 高精度练习之减法
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。

输入描述 Input Description
读入两个用空格隔开的正整数

输出描述 Output Description
输出A-B的值

样例输入 Sample Input
3 12

样例输出 Sample Output
-9

数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位

#include<cstdio>#include<cstring>using namespace std;char a[501],b[501];int c[501],d[501],l1,l2,l,mi;bool flag;void f(char x[],char y[]){    bool flag=false;    for (int i=1;i<=l;i++)    {        c[i]=x[i-1]-'0';        d[l-mi+i]=y[i-1]-'0';       }    for (int i=l;i>=1;i--)    if (c[i]-d[i]<0)     {        c[i-1]--;        c[i]=c[i]+10-d[i];    }    else c[i]=c[i]-d[i];    for (int i=1;i<=l;i++)     if ((c[i]!=0)||(flag))    {        printf("%d",c[i]);         flag=true;    }}int main(){     flag=false;     scanf("%s",&a);     scanf("%s",&b);     l1=strlen(a);     l2=strlen(b);     if (l1>l2)      {        l=l1;        mi=l2;        f(a,b);     }     else      if (l1<l2)      {         l=l2;         mi=l1;         printf("-");        f(b,a);     }     else      {       flag=true;       for (int i=0;i<=l1;i++)        if (a[i]>b[i])        {         l=l1;         f(a,b);         flag=false;         break;       }        else        if (a[i]<b[i])       {            l=l2;            mi=l1;            printf("-");            f(b,a);            flag=false;            break;       }     }     if (flag) printf("0");}

3117 高精度练习之乘法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。

输入描述 Input Description
读入两个用空格隔开的正整数

输出描述 Output Description
输出A*B的值

样例输入 Sample Input
3 12

样例输出 Sample Output
36

数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位

#include<iostream>#include<cstring>using namespace std;int an[501],bn[501],c[1001];main(){    char a[501],b[501];    cin>>a;    cin>>b;    int jw,la=strlen(a),lb=strlen(b);    for (int i=1;i<=la;i++) an[i]=a[i-1]-48;    for (int i=1;i<=lb;i++) bn[i]=b[i-1]-48;    for (int i=la;i>=1;i--)    {        for (int j=lb;j>=1;j--)        {            c[i+j]=c[i+j]+an[i]*bn[j];            jw=c[i+j]/10;               c[i+j-1]=jw+c[i+j-1];            c[i+j]%=10;        }    }    bool flag=false;    for (int i=1;i<=la+lb;i++)     if ((flag)||(c[i]!=0)){cout<<c[i];flag=true;}    return 0;} 

3118 高精度练习之除法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
给出两个正整数A和B,计算A/B整数部分的值。保证A和B的位数不超过500位。

输入描述 Input Description
读入两个用空格隔开的正整数

输出描述 Output Description
输出A/B整数部分的值

样例输入 Sample Input
15 4

样例输出 Sample Output
3

数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位

#include<cstdio>#include<string>#include<iostream>#include<cstring>using namespace std;char s1[510],s2[510];int a[510],b[510],c[510],ans[510];int compare(){    if (a[0]>c[0]) return 1;    if (a[0]<c[0]) return -1;    for (int i=c[0];i>=1;i--)    if (a[i]>c[i]) return 1;    else if (a[i]<c[i]) return -1;    return 0;} void solve(int x){    for (int i=1;i<=b[0];i++)    c[i+x-1]=b[i];    c[0]=b[0]-1+x;}void f(){    for (int i=1;i<=a[0];i++)    {        if (a[i]-c[i]<0) {a[i]+=10;a[i+1]--;}        a[i]-=c[i];    }    while (a[0]>0&&a[a[0]]==0) a[0]--;}main() {    scanf("%s%s",s1,s2);    a[0]=strlen(s1);    b[0]=strlen(s2);    if (a[0]<b[0]||(a[0]==b[0]&&strcmp(s1,s2)<0)) {printf("0");return 0;}    for (int i=1;i<=a[0];i++)   a[i]=s1[a[0]-i]-48;    for (int i=1;i<=b[0];i++)   b[i]=s2[b[0]-i]-48;    ans[0]=a[0]-b[0]+1;    for (int i=ans[0];i>=1;i--)    {        memset(c,0,sizeof(c));        solve(i);        while (compare()>=0)         {            f();            ans[i]++;        }    }    while (a[0]>1&&a[a[0]]==0) a[0]--;    for(int i=a[0];i>=1;i--) printf("%d",a[i]);    if (a[0]==0) printf("0"); }
0 0
原创粉丝点击