C/C++编程学习 - 第5周 ④ 石头剪刀布

题目链接

题目描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小 A 和小 B 正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小 A 和小 B 比了 N 轮之后,谁赢的轮数多?

输入格式
输入包含三行。

第一行包含三个整数:
N,NA,NB,分别表示比了
N 轮,小 A 出拳的周期长度,小 B 出拳的周期长度。0<N,NA,NB<100。

第二行包含 NA 个整数,表示小 A 出拳的规律。

第三行包含 NB 个整数,表示小 B 出拳的规律。

其中,0 表示“石头”,2 表示“剪刀”,5 表示“布”。相邻两个整数之间用单个空格隔开。

输出格式
输出一行,如果小 A 赢的轮数多,输出"A";如果小 B 赢的轮数多,输出"B";如果两人打平,输出 “draw”。

提示
对于测试数据,猜拳过程为:

A:0 2 5 0 2 5 0 2 5 0

B:0 5 0 2 0 5 0 2 0 5

A 赢了 4 轮,B 赢了 2 轮,双方打平 4 轮,所以 A 赢的轮数多。

Sample Input

10 3 4
0 2 5
0 5 0 2

Sample Output

A

思路

模拟石头剪刀布的过程,可以写一个函数判断一下谁赢了。

C语言代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
const long long N = 1e6 + 10;
long long n, m, cnt = 0, ans = 0, sum = 0;
long long is_a_win(long long a, long long b)//0石头 2剪刀 5布;//写个函数判断谁赢啦
{
	if((a == 0 && b == 2) || (a == 2 && b == 5) || (a == 5 && b == 0)) return 1;//A赢啦
	else if(a==b) return 0;//平手
	else return -1;//B赢啦
}
int main()
{
    long long a[N], b[N], A, B;
	scanf("%lld %lld %lld",&n, &A, &B);
	for(long long i = 0; i < A; i++)//录入A的规律
		scanf("%lld", &a[i]);
	for(long long i = 0; i < B; i++)//录入B的规律
		scanf("%lld", &b[i]);
    for(long long i = 0; i < n; i++)//模拟n场猜拳
    {
    	long long nowa, nowb;//这一局,第i场
    	nowa = a[i % A];//A出的是nowa
    	nowb = b[i % B];//B出的是nowb
    	cnt += is_a_win(nowa, nowb);//a赢啦,cnt就加一,B赢啦,就减一
    }
    if(cnt > 0) printf("A");//cnt>0 说明A赢得多
    else if(cnt < 0) printf("B");//cnt<0 说明B赢得多
    else printf("draw");//cnt==0, 平手    
	return 0;
}

C++代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n, a, b, numa[105], numb[105];
	while(cin >> n >> a >> b)
	{
		int A = 0, B = 0;
		memset(numa, 0, sizeof(numa));
		memset(numb, 0, sizeof(numb));
		for(int i = 0; i < a; i++)
			cin >> numa[i];
		for(int i = 0; i < b; i++)
			cin >> numb[i];
		for(int i = 0; i < n; i++)
			if((numa[i % a] == 0 && numb[i % b] == 2) || (numa[i % a] == 2 && numb[i % b] == 5) || (numa[i % a] == 5 && numb[i % b] == 0)) A++;
			else if((numa[i % a] == 2 && numb[i % b] == 0) || (numa[i % a] == 5 && numb[i % b] == 2) || (numa[i % a] == 0 && numb[i % b] == 5)) B++;
		if(A > B) cout << "A" << endl;
		else if(A < B) cout << "B" << endl;
		else if(A == B) cout << "draw" << endl;
	}
	return 0;
}

没有C语言基础的同学们,可以先学习一下C语言语法,我会整理好,后面发出来
我已经写好了,可以去C语言程序设计专栏第一周的内容

本周其他练习:

C语言程序设计专栏

C/C++编程学习 - 第5周 ① Hello World

C/C++编程学习 - 第5周 ② 向左看齐

C/C++编程学习 - 第5周 ③ 圆锥体的体积

C/C++编程学习 - 第5周 ④ 石头剪刀布

C/C++编程学习 - 第5周 ⑤ 人见人爱A+B

C/C++编程学习 - 第5周 ⑥ 四舍五入

C/C++编程学习 - 第5周 ⑦ 等差数列求和(1)

C/C++编程学习 - 第5周 ⑧ 判断直角三角形

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
河北工业大学计算机软件技术基础(VC) 课程设计任务书 题目:人机对战——石头剪刀布 目的与要求 目的 通过编写该程序,培养学生综合利用C++语言进行程序设计的能力,加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计,并对Windows平台下的控制台进行深入的了解。 基本要求 要求用C++语言编程,在Visual C++环境下调试完成; 要求划分功能模块,各个功能分别使用函数来完成; 源代码程序要求必要的注释。 设计方法和基本原理 课题功能描述 编写一个人机进行石头剪刀布的小游戏。要求能够进行完一轮猜拳后,显示统计信息。每一轮游戏的过程是首先由玩家选择要出的拳,然后计算机选择出拳,输出本轮游戏的负情况,然后输出统计信息(玩家利次数、计算机利次数和平局次数),然后每轮猜拳结束后,询问玩家是否要继续游戏。游戏界面如下: 主要技术问题的描述 随机函数 随机函数名为rand(),使用时必须包含头文件stdlib.h。 创新要求 在基本要求达到后,进行创新设计: 程序要保证计算机的利次数至少是玩家利次数的1.5倍。 课程设计的考核方式及评分方法 考核方式 (1) 学生要提交书面课程设计报告(A4纸打印);并将设计报告的电子文档、.cpp源文件和.h头文件放到一个文件夹里上传到所对应班级的学生名称相应文件夹中。 (2) 课程设计结束时,在机房当场验收。教师提供测试数据,由学生运行所设计的系统,检查运行结果是否正确,并回答教师提出的有关问题。 评分方法 根据出勤率、课程设计期间纪律、课程设计运行结果、课程设计报告及答辩情况综合评分。 书写设计报告的要求(详细内容见“设计报告模板”) 课程设计的有关文档“设计报告模板”和“课程设计要求”请在下载任务书处下载。    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水蛙菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值