小计算器--蓝桥

本文介绍了一个模拟程序型计算器的设计与实现,能够处理多种进制的数字运算,包括加、减、乘、除、取余等操作,并支持进制转换及输出。通过将所有输入数字转换为十进制进行计算,简化了不同进制下的复杂运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

模拟程序型计算器,依次输入指令,可能包含的指令有

  1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数
  2. 运算指令:'ADD','SUB','MUL','DIV','MOD',分别表示加减乘,除法取商,除法取余
  3. 进制转换指令:'CHANGE K',将当前进制转换为K进制(2≤K≤36)
  4. 输出指令:'EQUAL',以当前进制输出结果
  5. 重置指令:'CLEAR',清除当前数字

  指令按照以下规则给出:
  数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
  运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
  重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令
  进制转换指令可能出现在任何地方

  运算过程中中间变量均为非负整数,且小于2^63。
  以大写的'A'~'Z'表示10~35

输入格式

  第1行:1个n,表示指令数量
  第2..n+1行:每行给出一条指令。指令序列一定以'CLEAR'作为开始,并且满足指令规则

输出格式

  依次给出每一次'EQUAL'得到的结果

样例输入

7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL

样例输出

2040

分析

虽然有许多进制,但是在过程中,我们只需要将每次输入的数字转换为十进制,然后计算和保存,就不用在别的进制下计算了(因为在别的进制下计算很麻烦,例如16进制乘法),只需要在最后输出相应进制下的数就可以了。

代码

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f
ll num=0,r=10;//num:十进制下的结果,r:初始为十进制 
ll get10()//输入数字病得到十进制的值 
{
	ll sum=0,p=1;
	string s;
	cin>>s;
	for(int i=s.length()-1;i>=0;i--)//从右往左 
	{
		if(s[i]>='0'&&s[i]<='9')
			sum=sum+p*(s[i]-'0');
		else
			sum=sum+p*(s[i]-'A'+10);
		p*=r;//r的次方 
	}
	return sum;
}
void print()
{
	string s;
	ll m=num;
	if(m==0)
	{
		cout<<"0"<<endl;
		return ;
	}
	s="";
	while(m)
	{
		char c;
		if(m%r<=9)
			c=(m%r)+'0';
		else
			c=(m%r-10)+'A';
		s=c+s;//不能写成s+=c,含义不一样 
		m/=r;
	}
	cout<<s<<endl;
}
int main()
{
	int n,op=0;
	string s;
	scanf("%d",&n);
	while(n--)
	{
		cin>>s;
		if(s=="CLEAR")
		{
			num=0;
			op=0;
		}
		else if(s=="ADD")
			op=1;
		else if(s=="SUB")
			op=2;
		else if(s=="MUL")
			op=3;
		else if(s=="DIV")
			op=4;
		else if(s=="MOD")
			op=5;
		else if(s=="CHANGE")
			scanf("%d",&r);
		else if(s=="NUM")
		{
			switch(op)
			{
				case 0:num=get10();break;
				case 1:num+=get10();break;
				case 2:num-=get10();break;
				case 3:num*=get10();break;
				case 4:num/=get10();break;
				case 5:num%=get10();break;
			}
		}
		else if(s=="EQUAL")
			print();
	}
	return 0;
}

 

<think>好的,用户的问题是关于小球碰撞检测,特别是在蓝桥杯、物理引擎和游戏开发中的应用。首先,我需要明确碰撞检测的基本原理。小球碰撞属于圆形碰撞检测,通常使用几何方法判断两个球是否相交,即两球中心距离是否小于半径之和。这部分需要数学公式的支持,比如距离公式和向量运算。 接下来,要考虑如何在代码中实现。用户可能想知道具体的实现步骤,比如如何检测碰撞、处理碰撞后的速度变化。这里需要引用动量守恒和能量守恒定律,可能需要使用向量分解来计算碰撞后的速度方向。记得要使用正确的LaTeX格式来呈现公式,比如$v_1'$和$v_2'$的计算。 然后,用户提到的蓝桥杯可能涉及到算法竞赛中的相关问题,可能需要优化检测效率,比如使用空间分割算法如四叉树或网格法,来减少不必要的碰撞检测次数。这部分需要解释这些优化方法的原理和应用场景。 物理引擎方面,可能需要介绍现有的引擎如Box2D,以及它们如何处理碰撞检测,但用户可能更关注底层实现而不是直接使用引擎。因此,重点放在自行实现的步骤和注意事项上,比如时间步长处理和防止穿透的问题。 游戏开发中的应用场景,比如弹珠游戏或台球游戏,需要举例说明碰撞检测的具体应用,并强调实时性和精确性的平衡。可能还需要提到性能优化,比如使用近似算法或简化计算步骤。 最后,生成的相关问题需要覆盖数学原理、代码实现、优化方法和应用场景,确保用户能全面理解。同时,检查引用格式是否正确,比如动量守恒和弹性碰撞的公式引用。 现在需要将这些内容组织成结构清晰的回答,分步骤解释碰撞检测和处理的过程,并提供代码示例。同时确保所有数学公式符合规定的LaTeX格式,独立公式使用$$...$$,行内公式用$...$。最后,生成相关问题,帮助用户进一步学习。</think># 小球碰撞检测实现指南 ## 一、数学原理 ### 1.1 碰撞检测 对于两个小球$A(x_1,y_1)$和$B(x_2,y_2)$,检测条件为: $$ \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2} \leq r_1 + r_2 $$ 其中$r_1$, $r_2$为两球半径[^1] ### 1.2 碰撞响应 完全弹性碰撞时,使用动量守恒和动能守恒公式: $$ \begin{cases} m_1\vec{v_1} + m_2\vec{v_2} = m_1\vec{v_1'} + m_2\vec{v_2'} \\ \frac{1}{2}m_1v_1^2 + \frac{1}{2}m_2v_2^2 = \frac{1}{2}m_1v_1'^2 + \frac{1}{2}m_2v_2'^2 \end{cases} $$ 速度更新公式(质量相等时): $$ \vec{v_1'} = \vec{v_1} - \frac{2m_2}{m_1+m_2} \cdot \frac{(\vec{v_1}-\vec{v_2}) \cdot (\vec{p_1}-\vec{p_2})}{|\vec{p_1}-\vec{p_2}|^2}(\vec{p_1}-\vec{p_2}) $$ ## 二、代码实现 ### 2.1 基础检测(Python示例) ```python class Ball: def __init__(self, x, y, r): self.x = x self.y = y self.r = r def check_collision(a, b): dx = a.x - b.x dy = a.y - b.y distance_sq = dx*dx + dy*dy return distance_sq <= (a.r + b.r)**2 ``` ### 2.2 完整碰撞处理 ```python def resolve_collision(a, b): # 计算碰撞法线 nx = (b.x - a.x) / distance ny = (b.y - a.y) / distance # 计算相对速度 dvx = b.vx - a.vx dvy = b.vy - a.vy # 计算冲量 impulse = 2 * (dvx*nx + dvy*ny) / (1/a.mass + 1/b.mass) # 更新速度 a.vx += impulse/a.mass * nx a.vy += impulse/a.mass * ny b.vx -= impulse/b.mass * nx b.vy -= impulse/b.mass * ny ``` ## 三、性能优化 1. **空间分割**:使用四叉树/网格系统,将场景划分为多个区域,只检测相邻区域内的物体 2. **Broad Phase检测**:先用AABB包围盒快速筛选可能碰撞的对象 3. **运动预测**:通过速度矢量和时间步长预测下一帧位置,避免穿透 ## 四、应用场景 1. 弹珠台游戏(精确的动量传递) 2. 粒子系统模拟(大量小球交互) 3. 物理实验模拟器(如牛顿摆) 4. 台球游戏(结合摩擦力和旋转处理) ## 五、开发注意事项 1. **时间步长处理**:使用固定时间步长(如1/60秒)保证模拟稳定性 2. **穿透处理**:添加位置修正项:$$ \Delta p = \frac{\text{overlap}}{2} \cdot \vec{n} $$ 3. **非弹性碰撞**:添加恢复系数$0 \leq e \leq 1$,调整冲量计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值