第一周周报:预备队训练-week1(模拟与高精度)

考前说明:

高精度的题目其实可以选择用python或者java之类自带高精度运算的语言来做,但是这里希望大家能提升代码能力,所以强制使用c和c++。
高精度的实现其实很简单,用一个数组来存储一个数,数字123可以用数组{1, 2, 3}来存储(也可以逆序存储)。
最后用小学老师教过的方法来实现加减乘除即可。
希望没接触过高精度的同学能看完这些提示后独立写出。

7-1 h0094. 乒乓球

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。

其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。

华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。

在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。 

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分): 

WWWWWWWWWWWWWWWWWWWWWWLW 

在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。

而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。

如果一局比赛刚开始,则此时比分为0比0。 

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

输入格式:

每个输入文件包含若干行字符串(每行至多20个字母),字符串由大写的W、L和E组成。

其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

输出格式:

输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。

其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

#include<bits/stdc++.h>
using namespace std;
char a[10086],flag;
int n,H,A,x;
int main()
{   
while(cin>>flag)
{
a[n]=flag;
if(a[n]=='W')H++;
if(a[n]=='L')A++;
x=fabs(H-A);//计算分差
if((H==11&&x>=2)||(A==11&&x>=2))//分差要大于二
{
    cout<<H<<":"<<A<<endl;
    H=0,A=0,x=0;
}
if(a[n]=='E')//接受到“E”则结束
{
    cout<<H<<":"<<A<<endl<<endl;
    H=0,A=0,x=0;
    break;
}
n++;
}
for(int i=0;i<n;i++)
{
if(a[i]=='W')H++;
if(a[i]=='L')A++;
x=fabs(H-A);
if((A>=21||H>=21)&&x>=2)
{
    cout<<H<<":"<<A<<endl;
    H=0,A=0;
}
if(a[i]=='E')
{
    cout<<H<<":"<<A<<endl;
    break;
}
}

7-2 高精度加法(竖式运算即可,小学学过)

分数 15

对于输入的两个不超过100位数字的非负整数,给出两数之和。

输入格式:

在两行中分别给出两个不超过100位数字的非负整数

输出格式:

在一行中输出两数之和

#include<bits/stdc++.h>
using namespace std;
char a[199],b[199];
int A[199],B[199],C[199];
int main()
{
    cin>>a>>b;
    int m=strlen(a),n=strlen(b);
    for(int i=0;i<m;i++)
    {
        A[m-i]=a[i]-'0';//将以字符串形式输入的数字倒叙存入数组
    }
    for(int i=0;i<n;i++)
    {
        B[n-i]=b[i]-'0';
       // cout<<B[n-i]<<endl;
    }
    int y=m>n?m:n;//y是两者中大的
    for(int i=1;i<=y;i++)
    {
        C[i]=B[i]+A[i]+C[i];//进位
        C[i+1]+=C[i]/10;
        C[i]%=10;
    }
    if(C[y+1]!=0)y++;
    for(int i=y;i>=1;i--)
    {
        cout<<C[i];
    }
}

 

7-3 高精度求累加和

分数 25

使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?

输入格式:

输入在一行中给出1个位数不超过100位的整数N。

输出格式:

对每一组输入,在一行中输出1+2+3+……+N的值。tips:(使用等差数列求和公式)

#include<bits/stdc++.h>
using namespace std;
char ch[220];
int A[220],B[220],C[220],flag,L;
int main()
{
    cin>>ch;
    int n=strlen(ch);
    for(int i=0;i<n;i++)
    {
        A[n-i]=ch[i]-'0';//将字符串倒序转化为数字并存入整型数组A 
        B[n-i]=ch[i]-'0';//
    }
    A[1]++;
    for(int i=1;i<=n;i++)//判断+1后是否存在进位情况 
    {
        if(A[1]<10)break;
        A[i+1]+=A[i]/10;
        A[i]=A[i]%10;
        if(A[i+1]<10)break;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++){
            C[i+j-1]=A[j]*B[i]+C[i+j-1];//本位乘法
            C[i+j]+=C[i+j-1]/10;//进位
            C[i+j-1]%=10;//进位后的本位
        }
    }
    for(int i=2*n;i>=1;i--)
    {
        if(C[i]!=0)
        {
            flag=i;
            break;
        }
    }//判断(n+1)n的位数 
    for(int i=flag;i>=1;i--)
    {
       if(C[i]%2==0)C[i]/=2;
       else 
        {
           C[i-1]+=10;
           C[i]/=2;
        }
    }
    for(int i=flag;i>=1;i--)
    {
        if(C[i]!=0)
        {
            flag=i;
            break;
        }
    }//判断(n+1)n/2的位数 (因为都用的是flag存储长度)
    for(int i=flag;i>=1;i--)
    {
        cout<<C[i];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值