此题目特征为储存数字超过long long类型,c++无法用一个变量存储全部数字

解法为开数组来储存各个位上的数字

1.字符高精度

直接以两种方式处理字符即可

#include<bits/stdc++.h>
using namespace std;
char a[1000000];
int main(void) 
{
    int n=0,t1=0,t2=0;
        //输入
    while(cin>>a[n])
    {
        if(a[n]=='E')break;
        n++;
    }
        //计算11分制
    for(int i=0;i<n;i++)
    {
        if(a[i]=='W')t1++;
        else if(a[i]=='L')t2++;
        if((t1>=11||t2>=11)&&(t1-t2>=2||t2-t1>=2))
        {
            cout<<t1<<":"<<t2;
            cout<<endl;
            t1=0;t2=0;
        }
    }
        //计算21分制
    if(t1!=0||t2!=0)cout<<t1<<":"<<t2<<endl;
    cout<<endl;
    t1=0;t2=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]=='W')t1++;
        else if(a[i]=='L')t2++;
        
        if((t1>=21||t2>=21)&&(t1-t2>=2||t2-t1>=2))
        {
            cout<<t1<<":"<<t2;
            cout<<endl;
            t1=0;t2=0;
        }
    }
    if(t1!=0||t2!=0)cout<<t1<<":"<<t2;
    return 0;
}

2.高精度加法

 

 

 开两个数组后各位相加再进位即可

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int n1=0,n2=0,n,a[105]={0},b[105]={0},c[105]={0},in;
    char win1[105]={'a'},win2[105]={'a'};
    cin>>win1;
    for(int i=100,j=0;i>=0;i--)
    {
        if(win1[i]>=48&&win1[i]<=57)
        {
            a[j]=win1[i]-48;
            n1++;
            j++;
        }
    }
    cin>>win2;
    for(int i=100,j=0;i>=0;i--)
    {
        if(win2[i]>=48&&win2[i]<=57)
        {
            b[j]=win2[i]-48;
            n2++;
            j++;
        }
    }

    if(n1>n2)n=n1;
    else n=n2;
    for(int i=0;i<=n+1;i++)
    {
        c[i]=a[i]+b[i];
        if(c[i]>=10)
        {
            a[i+1]++;
            c[i]-=10;
        }
    }
    int start=0;
    for(int i=n;i>=0;i--)
    {
        if(c[i]!=0)
        {
            cout<<c[i];
            start=1;
            continue;
        }
        else if(start==0&&c[i]==0)
        {
            start=1;
            continue;
        }
        cout<<c[i];
    }
    cout<<endl;
    return 0;
}

3.高精度乘法

 

该题虽然为累加,但考虑到减少计算量,直接用高斯求和公式

关键为两高精度的乘积如何计算

据观察可知,乘法可一这样计算

 

 

 即一个高精度的每一位与另一高精度的每一位相乘后存储在一个新的高精度中,最后进位

 

#include<bits/stdc++.h>
using namespace std;
char win[105];
int main(void)
{
    int n=0,a[105]={0},c[205]={0};
    cin>>win;
    //逆序输入
    for(int i=100,j=0;i>=0;i--)
    {
        if(win[i]>=48&&win[i]<=57)
        {
            a[j]=win[i]-48;
            n++;
            j++;
        }
    }
    //得平方 
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            c[j+i]+=a[i]*a[j];;
        }
    }
    //得到n(n+1) 
    for(int i=0;i<n;i++)
    {
        c[i]+=a[i];
    }
    //除2 
    for(int i=2*n-2;i>=1;i--)
    {
        c[i-1]+=c[i]%2*10;
        c[i]-=(c[i]%2);
        c[i]/=2;
    }
    if(c[0]%2==1)c[0]=(c[0]+1)/2;
    else c[0]/=2;
    //进位
    for(int i=0;i<2*n-1;i++)
    {
        if(c[i]>10)c[i+1]+=c[i]/10;
        c[i]=c[i]%10;
    }
    //输出c
    int start=0;
    if(win[0]=='0')cout<<"0";
    else 
    {
        for(int i=200;i>=0;i--)
        {
            if(c[i]!=0)
            {
                start=i;
                break;
            }
        }
        for(;start>=0;start--)
        {
            cout<<c[start];
        }
    }
    return 0;
}

 

原文地址:http://www.cnblogs.com/if-I-can-fly/p/16879207.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性