没什么特别的数据吧。 只要把多余的0去掉比较就行了。
我是比较两部分,一部分是整数部分的,一部分是小数部分的。
我是比较两部分,一部分是整数部分的,一部分是小数部分的。
这道题还行,需要考虑多一点。应该不会有 000+123.00这种数据吧。反正我没考虑进去就a了。
写的比较长。200块之路,我来了。
A-B Problem
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧。
现在有两个实数A和B,聪明的你,能不能判断出A-B的值是否等于0呢?
-
输入
-
有多组测试数据。每组数据包括两行,分别代表A和B。
它们的位数小于100,且每个数字前中可能包含+,- 号。
每个数字前面和后面都可能有多余的0。
每组测试数据后有一空行。
输出
-
对于每组数据,输出一行。
如果A-B=0,输出YES,否则输出NO。
样例输入
-
1 1 1.0 2.0
样例输出
-
YES NO
-
-
#include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #include<limits.h> #define MOD 1000000007 #define fir first #define sec second #define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin) #define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout) #define mes(x, m) memset(x, m, sizeof(x)) #define Pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 #define Pi 4.0*atan(1.0) #define lowbit(x) (x&-x) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; typedef unsigned long long ull; const double eps = 1e-7; const int MAX = 101; using namespace std; #define time bool isZero(const string &str) //字符串转换,看该串字符是否为零 { int num; sscanf(str.c_str(), "%d", &num); //转换 if(num == 0){ //为0返回true return true; } return false; //不为0放回false } int main() { string A, B, C, D; //我这里A B代表整数部分, C, D代表小数部分 while(cin >> A >> B){ int flag1 = 0; // 符号标志 int flag2 = 0; if(A[0] == '+'){ //若有+, 去掉 A = A.substr(1, A.size()); } if(B[0] == '+'){ B = B.substr(1, B.size()); } if(A[0] == '-'){ // 负号就标记 flag1 = 1; } if(B[0] == '-'){ flag2 = 1; } int pos = 0; pos = A.find("."); // 找是否有小数点部分 C = A.substr(pos+1, A.size()); // 取小数点部分 if(pos == -1){ //没找打小数点会返回-1 没找到的话A的小数点部分就是0 C = "0"; } A = A.substr(0, pos); //同理 pos = B.find("."); D = B.substr(pos+1, B.size()); if(pos == -1){ D = "0"; } B = B.substr(0, pos); int len1 = A.size(); int len2 = B.size(); // cout << C << endl << D << endl; if(((isZero(C)&&!isZero(D)) || (!isZero(C)&&isZero(D)))){ //如果小数点部分一个为0一个不为0则直接输出NO cout << "NO" << endl; continue; } else if(C != D && (!isZero(C)&&!isZero(D))){ //如果C D长度不相等,可能数值大小是相等的 //如果小数部分都是0,直接直接跳过看整数部分 int len3 = C.size(); int len4 = D.size(); int k = len3; //为末尾开始去掉多余的0 while(C[--k] == '0'); C = C.substr(0, k+1); // cout << C << endl; k = len4; while(D[--k] == '0'); D = D.substr(0, k+1); // cout << D << endl; if(C != D){ //判断去掉多余的0之后是否相等,不想等直接输出0 cout << "NO" << endl; continue; } } //判断整数部分 if((!flag1 && !flag2) || (flag1 && flag2)){ //相等或者都为0直接输出YES if((A == B) || (isZero(A) && isZero(B))){ cout << "YES" << endl; continue; } else if((isZero(A)&&!isZero(B)) || (!isZero(A)&&isZero(B))){ //一个不为0一个为0直接输出NO cout << "NO" << endl; continue; } else{ if(flag1 || flag2){ //去掉符号 A = A.substr(1, len1); B = B.substr(1, len2); } int k = -1; //去掉多余的0 while(A[++k] == '0'); A = A.substr(k, len1); //取去掉0之后的部分 k = -1; while(B[++k] == '0'); B = B.substr(k, len2); if(A == B){ //判断 cout << "YES" << endl; continue; } else{ cout << "NO" << endl; continue; } } } else if((!flag1 && flag2) || (flag1 && !flag2)){ //一正一负 if(flag1){ //判断,去掉符号 A = A.substr(1, len1); } if(flag2){ //同上 B = B.substr(1, len2); } if(isZero(A)&&isZero(B)){ //除了0,其余相减都不为0 cout << "YES" << endl; continue; } else{ cout << "NO" << endl; } } } return 0; }
-
有多组测试数据。每组数据包括两行,分别代表A和B。