NEUQ-ACM预备队训练-week1(模拟与高精度)

前言及题解思路

个人刚开始学习算法,对这三个题目的解答采用了比较基础的方法。

感觉这次题目并不难,主要是实现模拟实际问题的过程 ,用简洁简单的代码实现思路。

  • 第一题采用string接受输入,直接把所有输入组合在一个string上,判断每一位的字母,给双方积累分数,达到胜利之后积分清零。

  • 第二题采用两个string接受输入,用两个vector数组存储输入数字的每一位,通过对每一位进行模拟相加判断进位的方法(类似列竖式),存储到另外一个数组中。

  • 第三题采用string接受输入,存储到一个数组中,另外建立一个比输入数字大1的数组,对每一位模拟乘法运算(类似列竖式),存储到另外一个数组中,再判断进位问题,最后使用求和公式,再模拟一次除法运算(竖式运算)。

(1)乒乓球

题目请添加图片描述请添加图片描述

代码

#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;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值