(Week 1)模拟与高精度(C++,数组模拟高精度)

h0094. 乒乓球(C++)

题目描述:

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

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

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

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

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

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

WWWWWWWWWWWWWWWWWWWWWWLW 

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

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

(注:注意:(1)乒乓球比赛两人的分差要大于等于2才能结束(2)比赛局数小于200)

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

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

输入格式:

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

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

输出格式:

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

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

输入样例:

WWWWWWWWWWWWWWWWWWWW

WWLWE

输出样例:

11:0

11:0

1:1

21:0

2:1

解题思路:

采用IPO思路构建代码:

(1)I:

首先利用getline()函数输入到临时字符串中,每输入一行字符串,利用find()和if的组合判断比赛是否结束,并将'E'之前的字符串拼接到存储结果的字符串中;

(2)P和O两步一起进行:

创建两个变量用于累计两名选手的分数;

采用for循环遍历输入的字符串;

在每轮循环中,先用if判断并累加两名选手的分数,再用if判断输出比赛结果,将两名选手的分数归零

代码如下:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
​
int main()
{
    int index;//用于判断比赛是否结束
    string temp, scores = "";//用于存储每行比赛结果,和所有比赛结果
    while (getline(cin, temp))
    {
        index = temp.find('E', 0);
        if (index == -1)
        {
            scores += temp;
            continue;//比赛未结束,继续读入
        }
        scores += temp.substr(0, index);
        break;
    }//累计完毕,开始输出结果
    int len = scores.length();
    int person_1 = 0, person_2 = 0;
    for (int i = 1; i <= len; i++)
    {
        if (scores[i - 1] == 'W')
        {
            person_1++;
        }
        else
        {
            person_2++;
        }
        if ((person_1 >= 11 || person_2 >= 11) && abs(person_1 - person_2) >= 2)
        {
            cout << person_1 << ':' << person_2 << endl;
            person_1 = 0;
            person_2 = 0;//输出结果,重置分数
        }
    }
    cout << person_1 << ':' << person_2 << endl;
    person_1 = 0, person_2 = 0;
    cout << endl;
    for (int i = 1; i <= len; i++)
    {
        if (scores[i - 1] == 'W')
        {
            person_1++;
        }
        else
        {
            person_2++;
        }
        if ((person_1 >= 21 || person_2 >= 21) && abs(person_1 - person_2) >= 2)
        {
            cout << person_1 << ':' << person_2 << endl;
            person_1 = 0;
            person_2 = 0;
        }
    }
    cout << person_1 << ':' << person_2 << endl;
    person_1 = 0, person_2 = 0;
    return 0;
}

高精度加法(C++,数组模拟高精度)

 题目描述:

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

输入格式:

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

输出格式:

在一行中输出两数之和

输入样例:

123 12

输出样例:

135

解题思路:

采用IPO思路实现:

(1)I:

创建两个数组,分别用于读入两个数字和读入数字时的下标;

将输入的数字看作为字符,采用while循环读入字符,并转化为数字存入整型数组中;

读入操作结束后,下标即可表示长度;

(2)P:

首先利用三目运算符判断两个数字的长度,实现将短的数加到长的数上;

再通过for循环将对应位置上的数字从低位到高位依次做和,每次做和之后通过if判断是否需要进位;

(3)O:

最高位单独处理,判断是否有进位;

剩余部分循环输出即可

代码如下:

#include <iostream>
using namespace std;
​
int main()
{
  int num_array[2][101] = { { 0 }, { 0 } };//用于存储两个数字
  int len[2] = {1, 1};//用于读入时的下标
  char temp = '\0';//临时字符
  int index[2];//用于加和时实现将短的数加到长的数之上
  for (int i = 0; i < 2; i++)//读入两个数字
  {
    while ((temp = getchar()) != '\n')
    {
      num_array[i][len[i]] = temp - 48;
      len[i]++;
    }
  }
  len[0] > len[1] ? index[0] = 1 : index[0] = 0;
  len[0] > len[1] ? index[1] = 0 : index[1] = 1;//将num_index[0]加到num_index[1]之上
  int i, j;
  for (i = len[index[0]] - 1, j = len[index[1]] - 1; i >= 1; i--, j--)//做和
  {
    num_array[index[1]][j] += num_array[index[0]][i];
    if (num_array[index[1]][j] >= 10)//进位
    {
      num_array[index[1]][j] -= 10;
      num_array[index[1]][j - 1] += 1;
    }
  }
  //输出结果
  if (num_array[index[1]][0] != 0)
  {
    cout << num_array[index[1]][0];
  }
  for (i = 1; i < len[index[1]]; i++)
  {
    cout << num_array[index[1]][i];
  }
  return 0;
}

高精度加法(C++,数组模拟高精度)

 题目描述:

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

输入格式:

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

输出格式:

在一行中输出两数之和

输入样例:

123 12

输出样例:

135

解题思路:

采用IPO思路实现:

(1)I:

创建两个数组,分别用于读入两个数字和读入数字时的下标;

将输入的数字看作为字符,采用while循环读入字符,并转化为数字存入整型数组中;

读入操作结束后,下标即可表示长度;

(2)P:

首先利用三目运算符判断两个数字的长度,实现将短的数加到长的数上;

再通过for循环将对应位置上的数字从低位到高位依次做和,每次做和之后通过if判断是否需要进位;

(3)O:

最高位单独处理,判断是否有进位;

剩余部分循环输出即可

代码如下:
 

#include <iostream>
using namespace std;

int main()
{
    int num_array[2][101] = { { 0 }, { 0 } };//用于存储两个数字
    int len[2] = {1, 1};//用于读入时的下标
    char temp = '\0';//临时字符
    int index[2];//用于加和时实现将短的数加到长的数之上
    for (int i = 0; i < 2; i++)//读入两个数字
    {
        while ((temp = getchar()) != '\n')
        {
            num_array[i][len[i]] = temp - 48;
            len[i]++;
        }
    }
    len[0] > len[1] ? index[0] = 1 : index[0] = 0;
    len[0] > len[1] ? index[1] = 0 : index[1] = 1;//将num_index[0]加到num_index[1]之上
    int i, j;
    for (i = len[index[0]] - 1, j = len[index[1]] - 1; i >= 1; i--, j--)//做和
    {
        num_array[index[1]][j] += num_array[index[0]][i];
        if (num_array[index[1]][j] >= 10)//进位
        {
            num_array[index[1]][j] -= 10;
            num_array[index[1]][j - 1] += 1;
        }
    }
    //输出结果
    if (num_array[index[1]][0] != 0)
    {
        cout << num_array[index[1]][0];
    }
    for (i = 1; i < len[index[1]]; i++)
    {
        cout << num_array[index[1]][i];
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitheredSakura_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值