第一周
第一题
题目1
有多行由字符W、L、E组成的比赛记录,分别判断在11分和21分制下的比赛结果
思路1
通过循环模拟判分过程,得到比赛结果
由于11分制和12分制的处理过程类似,可以编写一个函数统一处理
//判分的函数,n是分制,s是比赛记录
void Judge(int n, string s)
{
//w记录赢局数,l记录输局数
int w = 0, l = 0;
//循环读取记录
for(int i = 0; i < s.size(); i++)
{
if(s.at(i) == 'W')
{
w++;
}
else if(s.at(i) == 'L')
{
l++;
}
else
{
break;
}
//如果赢或者输局数超过指定数量,并且输赢相差超过2,则一轮结束
if((w >= n || l >= n) && abs(w - l) >= 2)
{
cout<<w<<":"<<l<<endl;
w = l = 0;
}
}
//如果结束的时候还有剩余的局数,则输出
if(w != 0 || l != 0)
{
cout<<w<<":"<<l<<endl;
}
}
主函数读取比赛信息并传给Judge函数处理
int main()
{
string s = "", t;
while(cin>>t)
{
s+=t;
}
Judge(11, s);
cout<<endl;
Judge(21, s);
return 0;
}
第二题
题目2
给出两个不超过100位的数字的积
思路2
高精度加法
用int数组来存储高精度数字的每一位
//输入1,输入2,结果
int num1[105], num2[105], num[105];
通过读取字符串,将数字的每一位存入数组,并记录较长的数字的长度
//两个数字的长度
int i1 = 0, i2 = 0;
//读取
string t;
cin>>t;
for(int i = 0; i < t.size(); i++)
{
num1[i] = t[t.size() - i - 1] - '0';
}
i1 = t.size();
cin>>t;
for(int i = 0; i < t.size(); i++)
{
num2[i] = t[t.size() - i - 1] - '0';
}
i2 = t.size();
//获得更长的长度
int maxi = max(i1, i2);
高精度加法
for(int i = 0; i < maxi; i++)
{
num[i] += num1[i] + num2[i];
//进位
if(num[i] > 9)
{
num[i + 1] = 1;
num[i] -= 10;
}
}
输出
//如果首位是由进位得到的,就输出
if(num[maxi] != 0)
{
cout<<num[maxi];
}
//输出剩下的位
for(int i = maxi - 1; i >= 0; i--)
{
cout<<num[i];
}
cout<<endl;
第三题
题目3
用公式求1到N的和
思路3
(N + 1) * N / 2
涉及到高精数加、高精数乘和将高精数除2
写一个结构体方便处理
#define Max 1000
struct High
{
int num[Max] = {0};
int length = 0;
};
高精加法
//与上一题相同
High Add(High num1, High num2)
{
High r;
int maxi = max(num1.length, num2.length);
for(int i = 0; i < maxi; i++)
{
r.num[i] += num1.num[i] + num2.num[i];
if(r.num[i] > 9)
{
r.num[i + 1] = 1;
r.num[i] -= 10;
}
}
if(r.num[maxi] == 0)
{
r.length = maxi;
}
else
{
r.length = maxi + 1;
}
return r;
}
高精乘法
High Multiply(High num1, High num2)
{
High r;
//循环将两个数中的每一位分别相乘
for(int i = 0; i < num1.length; i++)
{
for(int j = 0; j < num2.length; j++)
{
r.num[i + j] += num1.num[i] * num2.num[j];
//进位
if(r.num[i + j] > 9)
{
r.num[i + j + 1] += r.num[i + j] / 10;
r.num[i + j] %= 10;
}
}
//确定长度
for (int i = Max - 1; i >= 0; i--)
{
if (r.num[i] != 0)
{
r.length = i + 1;
break;
}
}
}
return highPrecision;
}
除以2
High DevideByTwo(High num1)
{
High r;
for(int i = num1.length - 1; i >= 0; i--)
{
//不为个位且不能整除时,将余数加给下一位
if(i != 0)
{
num1.num[i - 1] += (num1.num[i] % 2) * 10;
}
r.num[i] = num1.num[i] / 2;
}
//确定长度
for (int i = Max - 1; i >= 0; i--)
{
if (r.num[i] != 0)
{
r.length = i + 1;
break;
}
}
return r;
}
从字符串生成高精数
//与上一题相同
High GetHigh(string s)
{
High r;
for(int i = 0; i < s.size(); i++)
{
r.num[i] = s[s.size() - i - 1] - '0';
}
r.length = s.size();
return r;
}
主函数
int main()
{
//输入
string s;
cin>>s;
//高精数1
High one = GetHigh("1");
//高精数n
High n = GetHigh(s);
//通过公式和写好的函数计算结果
High r = DevideByTwo(Multiply(Add(n, one), n));
//输出
for(int i = r.length - 1; i >= 0; i--)
{
cout<<r.num[i];
}
return 0;
}