HDU 2054 判断大数是否相等
2017-01-12 23:41
323 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054
题解:这个题不严谨,仅判断后向0就行,而且不用判正负。
代码:
全面代码:没怎么优化,就是模拟各种情况,比较好理解,贴出来,如果漏情况了请告知我,谢谢
#include<iostream>
using namespace std;
const int maxn = 100000;
int judgePositive(char str1[], char str2[]) { //////判断正负 并记住
int flag1 = 1, flag2 = 1;
if (str1[0] == '-')
flag1 = 0;
if (str2[0] == '-')
flag2 = 0;
if (flag1 != flag2)
return 0;
return 1;
}
void cleanPrezero(char str[]) {////////////////去除前向0 最后格式为包含小数点的小数点前没0 (0.0----.0)
char temp[maxn];
strcpy(temp, str);
int len = strlen(str);
int flag = 0;
if (str[0] == '+' || str[0] == '-')
flag = 1; ////如果有符号 跳到下一个位置
for (;str[flag] == '0';flag++);
if (str[flag]=='\0') ///如果遇到结束,说明全为00000 所以回退一格 变为0 碰到小数点,就直接格式变为.0001
flag--;
int i;
for (i = 0;temp[flag]!='\0';i++) {
str[i] = temp[flag++];
}
str[i] = '\0';
}
void cleanlastzero(char str[]) { //////////////去除后向0
int len = strlen(str), digit_place = -1;
for (int i = 0;i < len;i++) {
if (str[i] == '.') {
digit_place = i;
break;
}
}
if (digit_place == -1) ////如果没有小数点不处理结束
return;
else {
int i;
for (i = len - 1;str[i] == '0';i--) {
str[i] = '\0';
}
if (i&&i == digit_place) /////如果遍历到小数点了并且不是字符串的第一个话就把小数点抹掉,比如23.0---23
str[i] = '\0';
if (i == 0)
str[i] = '0'; ////如果遍历到小数点是第一个字符,那么说明后项和前向全为0,那么整个字符串就是0了啊
}
}
int main() {
char str1[maxn], str2[maxn];
while (cin >> str1 >> str2) {
int flag = judgePositive(str1, str2);
cleanPrezero(str1);
//cout << str1 << endl;
cleanPrezero(str2);
//cout << str2 << endl;
cleanlastzero(str1);
//cout << str1 << endl;
cleanlastzero(str2);
//cout << str2 << endl;
if ((strcmp(str1, str2) == 0&&flag)||(strcmp(str1, str2) == 0 && strcmp(str1, "0") == 0)) // 符号位相等并且2个字符串相等
cout << "YES" << endl; //符号位不同但是都是0也相等
else
cout << "NO" << endl;
}
}
题解:这个题不严谨,仅判断后向0就行,而且不用判正负。
代码:
#include<iostream> using namespace std; const int maxn = 100000; void cleanlastzero(char str[]) { int len = strlen(str), digit_place = -1; for (int i = 0;i < len;i++) { if (str[i] == '.') { digit_place = i; break; } } if (digit_place == -1) return; else { int i; for (i = len - 1;str[i] == '0';i--) { str[i] = '\0'; } if (i == digit_place) str[i] = '\0'; } } int main() { char str1[maxn], str2[maxn]; while (cin >> str1 >> str2) { cleanlastzero(str1); cleanlastzero(str2); if (strcmp(str1, str2)==0) cout << "YES" << endl; else cout << "NO" << endl; } }
全面代码:没怎么优化,就是模拟各种情况,比较好理解,贴出来,如果漏情况了请告知我,谢谢
#include<iostream>
using namespace std;
const int maxn = 100000;
int judgePositive(char str1[], char str2[]) { //////判断正负 并记住
int flag1 = 1, flag2 = 1;
if (str1[0] == '-')
flag1 = 0;
if (str2[0] == '-')
flag2 = 0;
if (flag1 != flag2)
return 0;
return 1;
}
void cleanPrezero(char str[]) {////////////////去除前向0 最后格式为包含小数点的小数点前没0 (0.0----.0)
char temp[maxn];
strcpy(temp, str);
int len = strlen(str);
int flag = 0;
if (str[0] == '+' || str[0] == '-')
flag = 1; ////如果有符号 跳到下一个位置
for (;str[flag] == '0';flag++);
if (str[flag]=='\0') ///如果遇到结束,说明全为00000 所以回退一格 变为0 碰到小数点,就直接格式变为.0001
flag--;
int i;
for (i = 0;temp[flag]!='\0';i++) {
str[i] = temp[flag++];
}
str[i] = '\0';
}
void cleanlastzero(char str[]) { //////////////去除后向0
int len = strlen(str), digit_place = -1;
for (int i = 0;i < len;i++) {
if (str[i] == '.') {
digit_place = i;
break;
}
}
if (digit_place == -1) ////如果没有小数点不处理结束
return;
else {
int i;
for (i = len - 1;str[i] == '0';i--) {
str[i] = '\0';
}
if (i&&i == digit_place) /////如果遍历到小数点了并且不是字符串的第一个话就把小数点抹掉,比如23.0---23
str[i] = '\0';
if (i == 0)
str[i] = '0'; ////如果遍历到小数点是第一个字符,那么说明后项和前向全为0,那么整个字符串就是0了啊
}
}
int main() {
char str1[maxn], str2[maxn];
while (cin >> str1 >> str2) {
int flag = judgePositive(str1, str2);
cleanPrezero(str1);
//cout << str1 << endl;
cleanPrezero(str2);
//cout << str2 << endl;
cleanlastzero(str1);
//cout << str1 << endl;
cleanlastzero(str2);
//cout << str2 << endl;
if ((strcmp(str1, str2) == 0&&flag)||(strcmp(str1, str2) == 0 && strcmp(str1, "0") == 0)) // 符号位相等并且2个字符串相等
cout << "YES" << endl; //符号位不同但是都是0也相等
else
cout << "NO" << endl;
}
}
相关文章推荐
- (hdu step 9.1.1)A == B ?(在这个数字有可能是大数并且存在无效0的情况下,判断这两个数字是否相等)
- HDU 2807 The Shortest Path 【最短路 + 快速判断矩阵是否相等】
- C#如何判断两个日期是否相等
- Excel编写VBA判断2个值是否相等,然后改变单元格颜色
- HashSet 重写类的equals方法可以根据类的关键字段判断是否相等
- equals和hashcode方面判断对象是否相等是很重要的
- hdu 2444 判断是否构成二分图,并求最大匹配
- shell脚本中判断变量文件目录:权限、是否存在、空值、相等
- hdu 1086 判断两线段是否相交 (线段和直接是否相交)
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- Integer间判断值是否相等问题
- 学习体会:在JAVA中如何判断两个对象是否相等
- 判断量文件相等,判断某文本中是否含有某字符串
- 判断两个对象是否相等的js函数
- js 判断两个变量是否相等
- JS判断字符串是否相等
- 判断两个图片是否相等
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- 【C#食谱】【风味小吃】菜单1: 判断分数和小数之间是否近似相等
- C# 判断对象是否相等