第一题:
注意点:乒乓球比赛要领先两分才算获胜
#include<bits/stdc++.h>//万能头文件名
using namespace std;
int main()
{
string str;
char ch,c[100000];
int w=0,f=0,i=0;
while(ch!='E')
{
ch=getchar();
c[i]=ch;
i++;
}//我们直接将字符读入,由于我们要做两次计分操作,所以只能先读入数据,接下来用另一个循环操作
for (int j=0;j<=i;j++)
{
if (c[j]=='W') w++;
else if (c[j]=='L') f++;
if ((w >= 11 || f >=11)&&((w-f>=2)||(f-w>=2)))//注意要领先两分才获胜
{
cout<<w<<":"<<f<<endl;
w=0;
f=0;
}
else if (c[j]=='E')
{
cout<<w<<":"<<f<<endl;//找到‘E’,就输出,结束这种计分方式
//break;
}
}
w=0;f=0;//记得将计数器清零,否则会影响后面操作
cout<<endl;
for (int j=0;j<=i;j++)
{
if (c[j]=='W') w++;
else if (c[j]=='L') f++;
if ((w >= 21 || f >=21)&&((w-f>=2)||(f-w>=2)))
{
cout<<w<<":"<<f<<endl;
w=0;
f=0;
}
else if (c[j]=='E')
{
cout<<w<<":"<<f;
}
} //同理可得
}
评析:第一题比较简单,只要注意读入与进行先后操作的顺序,以及领先两分的赛制即可
第二题:高精度加法
要点:重点是想到倒序放入和处理进位、去零的操作
#include<bits/stdc++.h>
using namespace std;
int main()
{
int len,num1,num2,a[120]={0},b[120]={0},c[120]={0};
string str1,str2,s;
cin>>str1;
cin>>str2;
num1=str1.length();//求str1长
num2=str2.length();//求str2长
for(int i = 1;i<=num1; i++) a[i] = str1[num1 - i] - '0';//将第一个数倒序放入
for(int i = 1;i<=num2; i++) b[i] = str2[num2 - i] - '0';//将第二个数倒序放入
if (str1.length()>str2.length()) len=str1.length()+1;
else len=str2.length()+1;
for(int i = 1;i <= len; i++) c[i] = a[i] + b[i];//相加
for(int i = 1;i <= len; i++)
{
if (c[i] > 9)
{
c[i+1]++; //把进位往前加,因为一点小于18,所以只要加一即可,当然+c[i]/10也可
c[i]=c[i] % 10;//剩下个位
}
}//进位
while(c[len] == 0 && len > 1) len--;//去除末尾的零
for (int i=len;i>=1;i--)
{
cout<<c[i];
}
}
评析:先倒序放入很关键,这样大大简化了操作,不用考虑对齐的问题,美滋滋
第三题:高精度求累加和//陷阱,别累加
注意点:表面累加,实则乘除,因为若累加求和,能将进行上一次运算,完犊子
#include<bits/stdc++.h>
using namespace std;
int main()
{
int len,num1,num2,a[120]={0},b[120]={0},c[220]={0};
string str1,str2,s;
cin>>str1;
num1=str1.length();
for(int i = 1;i<=num1; i++) a[i] = str1[num1 - i] - '0'; //将第一个数倒序放入第一个数组
for(int i = 1;i<=num1; i++) b[i] = str1[num1 - i] - '0'; //将第一个数倒序放入第二个数组
b[1]++;
for (int i=1;i<=num1;i++)
{
if (b[i]>9)
{
b[i+1]+=b[i]/10;
b[i]=b[i] % 10;
}
}//注意:数组b[i]加1就可能产生进位哟,但写完第二题的我们如法炮制即可
for (int j=1;j<=num1;j++)
{
for (int i=1;i<=num1;i++)
{
c[i+j-1]+=a[i]*b[j];//极其之巧妙,如何处理每行积的横移相加,那就是i+j+1定位,直接搞定
}
}//高精乘
for (int i=1;i<=2*num1;i++)//注意这里我们的长度变长了
{
if (c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]=c[i] % 10;
}
}//处理进位
for(int i =2*num1;i >= 1;--i)//注意:你永远无法把出发倒过来除
{
c[i - 1] += 10 * (c[i] % 2);//剩下的数落下去要乘10别忘了
c[i] /= 2;
}//高精除
while(c[2*num1] == 0 && 2*num1 > 1) 2*num1--;//去除末尾的零
for(int i =2*num1;i >= 1;--i) cout<<c[i];
return 0;
}
评析:对高精加的升华,注意各项操作的细节,但不要被表面所吓倒,深挖下去都是相似的