n个人参加乒乓球比赛,1vs1,要比赛多少次?

按常规方法

#include<stdio.h>
#include<math.h>

int ping(int n)
{
	int count = 0;
	while (n > 1)
	{
		count =count + n / 2;
		n = n-n / 2;
	}
	return count;
}

int main()
{
	printf("请输入比赛的人数\n");
	int a;
	scanf_s("%d", &a);
	printf("%d", ping(a));
}

但如果反向思考,从淘汰选手入手,一共有n个人,一场比赛只能淘汰1个人,则比赛(n-1)次

#include<stdio.h>
#include<math.h>
int main()
{
	printf("请输入比赛的人数\n");
	int n;
	scanf_s("%d", &n);
	printf("%d", n-1);
}

短短几行代码就可以实现,是不是很惊喜!!!

所以生活中很多事我们都需要逆向思考。

塞翁失马,焉知非福呢。
                 

为了编写乒乓球比赛的主函数,我们需要综合考虑面向对象的设计思路和核心逻辑。以下是一个完整的主函数实现: ### 主函数实现 ```python import random class Player: def __init__(self, name, nationality, ability): self.name = name self.nationality = nationality self.ability = ability def show(self): return f"{self.name} ({self.nationality}) - 能力值: {self.ability}" class Set: def __init__(self, set_number, player1, player2): self.set_number = set_number self.player1 = player1 self.player2 = player2 self.score1 = 0 self.score2 = 0 self.set_winner = None def run_set(self): while True: if self.run_score(): self.score1 += 1 else: self.score2 += 1 print(f"第 {self.set_number} 局: {self.score1}:{self.score2}") if self.check_win_condition(): break def run_score(self): # 计算 player1 得分的概率 p = (self.player1.ability - self.player2.ability) / 100 * 2 r = random.random() return r < p def check_win_condition(self): if self.score1 >= 11 and self.score1 - self.score2 >= 2: self.set_winner = self.player1 return True elif self.score2 >= 11 and self.score2 - self.score1 >= 2: self.set_winner = self.player2 return True return False class Match: def __init__(self, player1, player2): self.player1 = player1 self.player2 = player2 self.set_score1 = 0 self.set_score2 = 0 self.match_winner = None self.all_sets = [] def run_match(self): for i in range(5): new_set = Set(i + 1, self.player1, self.player2) new_set.run_set() self.all_sets.append(new_set) if new_set.set_winner == self.player1: self.set_score1 += 1 elif new_set.set_winner == self.player2: self.set_score2 += 1 if self.check_match_winner(): break def check_match_winner(self): if self.set_score1 >= 3: self.match_winner = self.player1 return True elif self.set_score2 >= 3: self.match_winner = self.player2 return True return False def main(): # 输入选手信息 player1_name, player1_ability, player1_nationality = input("请输入第一位选手的名字、能力值和国籍(空格隔开): ").split() player2_name, player2_ability, player2_nationality = input("请输入第二位选手的名字、能力值和国籍(空格隔开): ").split() player1 = Player(player1_name, player1_nationality, int(player1_ability)) player2 = Player(player2_name, player2_nationality, int(player2_ability)) print(f"{player1.show()} vs {player2.show()}") match = Match(player1, player2) match.run_match() print(f"\n{player1.name} vs {player2.name} - 最终结果: {match.set_score1}:{match.set_score2}") print(f"{match.match_winner.name} 赢得了比赛") if __name__ == "__main__": main() ``` ### 说明 1. **Player 类**: - 初始化方法 `__init__` 设置选手的名称、国籍和能力值。 - `show` 方法返回选手的信息字符串。 2. **Set 类**: - 初始化方法 `__init__` 设置局编号、参赛选手和初始分数。 - `run_set` 方法模拟一局的比赛,直到某一方满足胜利条件。 - `run_score` 方法模拟每一分的结果。 - `check_win_condition` 方法检查当前局是否已结束。 3. **Match 类**: - 初始化方法 `__init__` 设置参赛选手、初始局数和所有局列表。 - `run_match` 方法模拟整场比赛,直到某一方赢得三局。 - `check_match_winner` 方法检查当前比赛是否已结束。 4. **主函数 `main`**: - 获取用户输入的选手信息并创建 `Player` 对象。 - 创建 `Match` 对象并运行比赛。 - 输出比赛结果。 这个实现涵盖了乒乓球比赛的主要逻辑,包括每一分、每局和整场比赛的模拟。希望这对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值