hdu 2054 A==B?

本文介绍了一种解决HDU 2054 A==B问题的方法,通过去除字符串中的多余字符并进行比较来判断两个浮点数是否相等。该方法考虑了正负号、前导零、小数点和尾随零等因素。

hdu  2054  A==B?             题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054

模拟(似乎已经可以不算太水了)

题目大意:输入两个数,判断两个数是否相等,相等输出YES,反之NO。

题目分析:小数点,会有的;正负号,会有的;前导0,会有的;小数点后的末尾0,也会有的(好像就这么些了,也不多,是吧)。我的思想是把正负号、前导后继什么的都去掉,小数点按位统一并去掉,短的补0,然后比较剩余部分,一致的话再看符号。

#include<iostream>
#include<string> 
using namespace std;
int main()
{
	int i,j,dt1,dt2;
	bool sy1,sy2,flag1,flag2;
	string s1,s2; 
	while(cin>>s1>>s2)
	{
		dt1=dt2=-1;
		flag1=flag2=sy1=sy2=true;//true为正
		if(s1[0]=='-')sy1=false,s1.erase(0,1);
		if(s2[0]=='-')sy2=false,s2.erase(0,1);
		if(s1[0]=='+')sy1=true,s1.erase(0,1);
		if(s2[0]=='+')sy2=true,s2.erase(0,1);
		while(s1[0]=='0')s1.erase(0,1);
		while(s2[0]=='0')s2.erase(0,1);
		if(s1.find('.',0)>=0&&s1.find('.',0)<s1.size())
		while(s1[s1.size()-1]=='0')s1.erase(s1.size()-1,1);
		if(s2.find('.',0)>=0&&s2.find('.',0)<s2.size())
		while(s2[s2.size()-1]=='0')s2.erase(s2.size()-1,1);
		for(i=0;i<s1.size()&&dt1==-1;i++)
		{
			if(s1[i]=='.')s1.erase(i,1),dt1=s1.size()-i;
		}
		for(i=0;i<s2.size()&&dt2==-1;i++)
		{
			if(s2[i]=='.')s2.erase(i,1),dt2=s2.size()-i;
		}
		if(dt1==-1)dt1++;
		if(dt2==-1)dt2++;
		if(dt1>dt2)s2.append(dt1-dt2,'0');
		else s1.append(dt2-dt1,'0');
		//cout<<"s1 == "<<s1<<endl;
		//cout<<"s2 == "<<s2<<endl;
		//cout<<"dt1 == "<<dt1<<" dt2== "<<dt2<<endl;
		if(s1.empty()&&s2.empty()||s1==s2&&sy1==sy2)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

PS:以前的一道题,当时(13年4月8号下午)极其菜,一看以为是跟A+B一个等级的题,3wrong,看discuss被吓退。今日重写居然没wrong一条过O(∩_∩)O~!

PPS:这道题可以算是中等模拟,大模拟是poj3760那种,现在还不敢想。



PPPS:后来发现,这样的代码居然也能A……

# include <stdio.h>
# include <string.h>
char *norm(char *a)
{
    int len=strlen(a);
    if(strchr(a,'.')!=NULL)
    {
        while(a[--len]=='0');
            if(a[len]=='.')
                len--;
            a[len+1]='\0';
    }
    return a;
}
int main()
{
    char a[12001],b[12001];
    while(scanf("%s%s",a,b)!=EOF)
    {
        if(!strcmp(norm(a),norm(b)))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
也就是说,前导0没有,正负号其实也是没有的…………






HDU 2034 是一道经典的 A-B Problem 题目,通常涉及简单的数学运算或者字符串处理逻辑。以下是对此类问题的分析以及可能的解决方法。 ### HDU 2034 的题目概述 该题目要求计算两个数之间的差值 \(A - B\) 并输出结果。需要注意的是,输入数据可能存在多种情况,因此程序需要能够适应不同的边界条件和特殊情况[^1]。 #### 输入描述 - 多组测试数据。 - 每组测试数据包含两行,分别表示整数 \(A\) 和 \(B\)。 #### 输出描述 对于每组测试数据,输出一行表示 \(A - B\) 的结果。 --- ### 解决方案 此类问题的核心在于正确读取多组输入并执行减法操作。以下是实现此功能的一种常见方式: ```python while True: try: a = int(input()) b = int(input()) print(a - b) except EOFError: break ``` 上述代码片段通过循环不断接收输入直到遇到文件结束符 (EOF),适用于批量处理多组测试数据的情况。 --- ### 特殊考虑事项 尽管基本思路简单明了,在实际编码过程中仍需注意以下几点: 1. **大数值支持**:如果题目中的 \(A\) 或 \(B\) 可能非常大,则应选用可以容纳高精度的数据类型来存储这些变量。 2. **负数处理**:当 \(B>A\) 导致结果为负时,确保程序不会因符号错误而失效。 3. **异常捕获**:为了防止运行期间由于非法字符或其他意外状况引发崩溃,建议加入必要的错误检测机制。 --- ### 示例解释 假设给定如下样例输入: ``` 5 3 7 2 ``` 按照以上算法流程依次完成各步操作后得到的结果应当分别为 `2` 和 `5`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值