前言及题解思路
个人刚开始学习算法,对这三个题目的解答采用了比较基础的方法。
感觉这次题目并不难,主要是实现模拟实际问题的过程 ,用简洁简单的代码实现思路。
-
第一题采用string接受输入,直接把所有输入组合在一个string上,判断每一位的字母,给双方积累分数,达到胜利之后积分清零。
-
第二题采用两个string接受输入,用两个vector数组存储输入数字的每一位,通过对每一位进行模拟相加判断进位的方法(类似列竖式),存储到另外一个数组中。
-
第三题采用string接受输入,存储到一个数组中,另外建立一个比输入数字大1的数组,对每一位模拟乘法运算(类似列竖式),存储到另外一个数组中,再判断进位问题,最后使用求和公式,再模拟一次除法运算(竖式运算)。
(1)乒乓球
题目![请添加图片描述](https://img-blog.csdnimg.cn/2e5ace2202a744a2b96f353cc86a38ec.png)
![请添加图片描述](https://img-blog.csdnimg.cn/8d95c2ad0ab44184a41bf94bbd687e8b.png)
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
string a1;
cin>>a1;
int f=0;
if(a1[a1.length()-1]=='E') f=1;
while(f==0){
string a;
cin>>a;
a1+=a;
if(a[a.length()-1]=='E') f=1;
}
int f1=0,f2=0;
int w1=0,l1=0,w2=0,l2=0;
int temp1=0,temp2=0;
while(f1==0) {
if(a1[temp1]=='W') w1++;
else if(a1[temp1]=='L') l1++;
else if(a1[temp1]=='E') f1=1;
temp1++;
if(w1>=11&&w1-l1>=2||l1>=11&&l1-w1>=2) {
cout<<w1<<":"<<l1<<endl;
w1=0;
l1=0;
}
else if(f1==1) {
cout<<w1<<":"<<l1<<endl;
}
}
cout<<endl;
while(f2==0) {
if(a1[temp2]=='W') w2++;
else if(a1[temp2]=='L') l2++;
else if(a1[temp2]=='E') f2=1;
temp2++;
if(w2>=21&&w2-l2>=2||l2>=21&&l2-w2>=2) {
cout<<w2<<":"<<l2<<endl;
w2=0;
l2=0;
}
else if(f2==1) {
cout<<w2<<":"<<l2<<endl;
}
}
return 0;
}
(2)高精度加法
题目
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
vector<int>a;
vector<int>b;
char x;
x=getchar();
while(x!='\n'){
int a1=x-'0';
a.push_back(a1);
x=getchar();
}
reverse(a.begin(),a.end());
x=getchar();
while(x!='\n'){
int b1=x-'0';
b.push_back(b1);
x=getchar();
}
reverse(b.begin(),b.end());
int c[101];
memset(c,0,sizeof(c));
for(int i=0;i<min(a.size(),b.size());i++){
if(a[i]+b[i]<10) c[i]+=a[i]+b[i];
else{
c[i]+=a[i]+b[i]-10;
c[i+1]+=1;
}
}
if(a.size()>b.size()){
for(int i=b.size();i<a.size();i++){
c[i]+=a[i];
}
}
else if(a.size()<b.size()){
for(int i=a.size();i<b.size();i++){
c[i]+=b[i];
}
}
int f=0;
for(int i=100;i>=0;i--){
if(c[i]>0||f==1){
cout<<c[i];
f=1;
}
}
return 0;
}
(3)高精度求累加和
题目
代码
#include<bits/stdc++.h>
using namespace std;
void addd(int S[]) {
for(int i=0; i<205; i++) {
if(S[i]>=10) {
S[i+1]+=S[i]/10;
S[i]=S[i]%10;
}
}
}
int main() {
string n;
cin>>n;
int N[101];
memset(N,0,sizeof(N));
for(int i=n.length()-1; i>=0; i--) {
int n1;
n1=n[n.length()-1-i]-'0';
N[i]=n1;
}
int M[101];
for(int i=0;i<101;i++){
M[i]=N[i];
}
M[0]++;
for(int i=0;i<101;i++){
if(M[i]==10){
M[i]=0;
M[i+1]++;
}
}
int S[205];
memset(S,0,sizeof(S));
for(int i=0;i<n.length();i++){
for(int j=0;j<n.length()+1;j++){
S[i+j]+=N[i]*M[j];
}
}
addd(S);
int f=0;
for(int i=204; i>=0; i--) {
if(i>0&&S[i]%2!=0) S[i-1]+=10;
S[i]/=2;
if(S[i]>0||f==1){
cout<<S[i];
f=1;
}
}
return 0;
}