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;
}