A == B ?
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 64960 Accepted Submission(s): 10164
Problem Description
Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".
Input
each test case contains two numbers A and B.
Output
for each case, if A is equal to B, you should print "YES", or print "NO".
Sample Input
1 2
2 2
3 3
4 3
Sample Output
NO YES YES NO
解题心得:
1、这个题很水,不要想得太简单也不要想得太难。就是用数字的规则比较两个字符串是否相等,但是会有小数,还有后导0。
2、其实写这种水题比较考验思维,思维混乱的,写得乱七八糟,要冷静地去思考,考虑是否可以使用stl解决。如果不可以再手动比较,手动比较的时候理清楚思维,不要写得一团乱麻,程序员不要太勤劳,用代码去硬怼题,越写越乱在后面找bug的时候就要炸了。思维清晰,分部分分功能去写。
调用stl(strcmp)的代码:
//使用strcmp,只需要将小数点后面的字符0改为数字0,就可以全部解决了 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5; char a[maxn],b[maxn]; bool check_pointa() { for(int i=0; i<maxn ;i++) if(a[i] == '.') return true; return false; } bool check_pointb() { for(int i=0; i<maxn ;i++) if(b[i] == '.') return true; return false; } int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); while(scanf("%s%s",a,b)!=EOF) { bool flaga = false,flagb = false; //检查是否有小数点,有小数点将小数点后面无用的字符0化为数字0方便后面的比较 flaga = check_pointa(); flagb = check_pointb(); if(flaga) { for(int i=maxn-1;i>=0;i--) { if(a[i]=='0' || a[i] ==0) a[i] = 0; else { if(a[i] == '.') a[i] = 0; break; } } } if(flagb) { for(int i=maxn-1;i>=0;i--) { if(b[i]=='0' || b[i] ==0) b[i] = 0; else { if(b[i] == '.') b[i] = 0; break; } } } if(strcmp(a,b) == 0)//直接比较,因为已经将字符0改为了数字0,前导0也就不用管了 printf("YES "); else printf("NO "); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); } return 0; }
手动比较的代码:(这个玩意儿复杂死了,都不知道当时自己为什么这么勤快居然老老实实写完了)
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5; char a[maxn],b[maxn]; int lena,lenb; int posa,posb; void cmp1() { if(lena != lenb)//数位不等直接返回 { printf("NO "); return ; } for(int i=0; i<lena; i++)//数位相等直接比较 if(a[i] != b[i]) { printf("NO "); return; } printf("YES "); } void cmp2() { if(posb != lena)//b的整数数位比a大,直接返回 { printf("NO "); return; } for(int i=posb+1; i<lenb; i++)//因为a是整数,只要b的小数部分不全为0直接返回 { if(b[i] != '0') { printf("NO "); return ; } } for(int i=0; i<posb; i++)//b小数部分为0,整数数位相等,逐位比较就好 if(a[i] != b[i]) { printf("NO "); return; } printf("YES "); } void cmp3() { //和cmp2差不多 if(posa != lenb) { printf("NO "); return; } for(int i=posa+1; i<lena; i++) { if(a[i] != '0') { printf("NO "); return ; } } for(int i=0; i<posa; i++) if(a[i] != b[i]) { printf("NO "); return; } printf("YES "); } void cmp4() { if(posa != posb)//整数数位不相等直接返回 { printf("NO "); return; } for(int i=0; i<posa; i++)//整数数位相等,逐位比较 if(a[i] != b[i]) { printf("NO "); return; } int len1 = min(lena - posa - 1,lenb - posb -1);//以较短的那个小数位数的为标准进行诸位比较 for(int i=0; i<len1; i++) { if(a[i+posa] != b[i+posb]) { printf("NO "); return; } } int len2 = max(lena - posa - 1,lenb - posb - 1);//小数数位比较多的那个多出来的部分不为字符0也不相等 int len = len2 - len1; if(len2 == lena - posa - 1)//a的位数更多 { for(int i=0; i<len; i++) if(a[i+len1+1+posa] != '0') { printf("NO "); return; } } if(len2 == lenb - posb - 1)//b的位数更多 { for(int i=0; i<len; i++) if(b[i+len1+1+posb] != '0') { printf("NO "); return; } } printf("YES "); } int main() { while(scanf("%s%s",a,b)!=EOF) { lena = strlen(a); lenb = strlen(b); posa = 0,posb = 0; bool flaga = false,flagb = false; int len = max(lena,lenb); //将小数部分和整数部分分开,同时也检查是否有小数部分 for(int i=0; i<len; i++) { if(a[i] == '.') { posa = i; flaga = true; } if(b[i] == '.') { posb = i; flagb = true; } } //都只用整数部分 if(!flaga && !flagb) cmp1(); //a只有整数部分,b有小数部分 if(!flaga && flagb) cmp2(); //b只有整数部分,a有小数部分 if(flaga && !flagb) cmp3(); //都有小数部分 if(flaga && flagb) cmp4(); } }