1071. 小赌怡情(15)

常言道“小赌怡情”。这是一个很简单的小游戏:首先由计算机给出第一个整数;然后玩家下注赌第二个整数将会比第一个数大还是小;玩家下注t个筹码后,计算机给出第二个数。若玩家猜对了,则系统奖励玩家t个筹码;否则扣除玩家t个筹码。

注意:玩家下注的筹码数不能超过自己帐户上拥有的筹码数。当玩家输光了全部筹码后,游戏就结束。

输入格式:

输入在第一行给出2个正整数T和K(<=100),分别是系统在初始状态下赠送给玩家的筹码数、以及需要处理的游戏次数。随后K行,每行对应一次游戏,顺序给出4个数字:

n1 b t n2

其中n1n2是计算机先后给出的两个[0, 9]内的整数,保证两个数字不相等。b为0表示玩家赌“小”,为1表示玩家赌“大”。t表示玩家下注的筹码数,保证在整型范围内。

输出格式:

对每一次游戏,根据下列情况对应输出(其中t是玩家下注量,x是玩家当前持有的筹码量):

  • 玩家赢,输出
    Win t!  Total = x.
  • 玩家输,输出
    Lose t.  Total = x.
  • 玩家下注超过持有的筹码量,输出
    Not enough tokens.  Total = x.
  • 玩家输光后,输出
    Game Over.
    并结束程序。
输入样例1:
100 4
8 0 100 2
3 1 50 1
5 1 200 6
7 0 200 8
输出样例1:
Win 100!  Total = 200.
Lose 50.  Total = 150.
Not enough tokens.  Total = 150.
Not enough tokens.  Total = 150.
输入样例2:
100 4
8 0 100 2
3 1 200 1
5 1 200 6
7 0 200 8
输出样例2:
Win 100!  Total = 200.
Lose 200.  Total = 0.

Game Over.

#include<iostream>
using namespace std;
int main()
{
	int sum,n;
	scanf("%d %d",&sum,&n);
	for(int i=0;i<n;i++)
	{
		int a,b,c,d;
		scanf("%d %d %d %d",&a,&b,&c,&d);
		if((d>a&&b==1||d<a&&b==0)&&c<=sum)
		{
			sum=sum+c;
			printf("Win %d!  Total = %d.\n",c,sum);
		}
		else
		{
			
			if(sum-c<0||c>sum)
			{
				printf("Not enough tokens.  Total = %d.\n",sum);
			}
			else if(sum-c==0)
			{
				sum=sum-c;
				printf("Lose %d.  Total = 0.\nGame Over.",c);
				return 0;
			}
			else
			{
				sum=sum-c;
				printf("Lose %d.  Total = %d.\n",c,sum);
			}
		
		}
	}
}

### PAT 1071 小赌怡情 测试点错误原因及解决方案 #### 错误可能的原因 在解答 PAT 乙级 1071 题目时,测试点错误通常源于以下几个方面: 1. **输入处理不完全** 如果程序未能正确读取所有的输入数据,可能会导致部分测试点失败。例如,在某些情况下,玩家的下注次数 `N` 可能为零,或者下注金额超出范围等情况未被妥善处理[^1]。 2. **边界条件忽略** 边界情况往往是测试点的重点之一。比如当两个随机数相等时,应视为既不大也不小的情况,此时不应增减筹码数量[^3]。 3. **逻辑判断失误** 判断大小关系时可能出现逻辑错误,例如混淆了“大于”和“小于”的条件,或者没有考虑负数作为下注金额的可能性[^2]。 4. **溢出问题** 若使用的变量类型不足以存储最终的结果(尤其是累加后的总筹码),则可能导致计算结果错误。因此建议使用更大的数据类型来保存中间结果和最终答案。 5. **格式化输出不符合要求** 输出格式严格遵循题目规定非常重要。如果多了一个空格、少了换行符或是数字精度不对都会引起不必要的扣分。 #### 解决方案 以下是针对上述常见问题的具体改进措施以及一段完整的 C++ 实现代码供参考: - 确保能够完整接收所有必要的输入参数; - 对特殊情形如 N=0 或者 bet_i ≤ 0 进行额外验证并跳过这些非法操作; - 使用 long 类型或其他更宽泛的数据结构防止潜在数值越界风险; - 准确实现比较运算符的功能定义,并注意等于号单独讨论的情形; - 最终打印结果前仔细核对字符串拼接方式是否满足样例标准。 ```cpp #include <iostream> using namespace std; int main(){ int n, num1, num2; long total = 0; // Use 'long' to prevent overflow cin >> n >> num1; while(n--){ char guess; int bet; cin >> guess >> bet; if(bet <= 0){ continue; // Ignore invalid bets as per problem statement. } cin >> num2; if(num1 == num2){ ;// Do nothing when numbers are equal. }else{ bool correctGuess = ((guess == '<') && (num2 < num1)) || ((guess == '>') && (num2 > num1)); if(correctGuess){ total += bet; }else{ total -= bet; } } num1 = num2; // Update first number for next round. } cout << total; } ``` 此版本代码已考虑到多种异常状况下的行为表现,并通过适当调整变量声明确保不会因为简单的技术细节而丢掉分数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值