EOJ-2032 判断两个数是否相等
http://acm.cs.ecnu.edu.cn/problem.php?problemid=2032
测试数据必须用字符串处理,情况比较多,代码比较乱,仅说明思路。
将两个字符串进行“正常化”,即变成正常的数据(没有符号,前置零等等)
case 1: .xxxxx 即小数点前面无零 需在前加0。
case 2: 前置符号+或-,记录一下符号,并去除、 #特殊情况: +. xxx 或 -. xxx 符号后面直接加小数点,需在前面加零。
case 3:去除前置零: 00000xxxx 或者是00000000的情况,去除多余的零,但要小心0. XX的情况。
case 4:去除后置0:即xx.xx00000000,需注意xx.xxx000000x之类的情况,以及x.00000的情况。
case 5:两个都是零,但是输入是-0和0 此时符号不同 也应该特殊判断。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<string> 8 #include<cctype> 9 using namespace std; 10 int main(){ 11 char a[505],b[505]; 12 while(scanf("%s%s",a,b)!=EOF){ 13 char s[505],t[505]; 14 int len=strlen(a); 15 int pa=1,f=1; 16 if(a[0]=='.') {s[0]='0';strcpy(s+1,a);f=0;} //case 1 .xxx 17 if(a[0]=='-') { //case 2 -xxx 18 pa=0; 19 if(a[1]=='.'){ //#特殊情况 -.xxxx 20 s[0]='0'; 21 strcpy(s+1,a+1); 22 f=0; 23 } 24 } 25 if(a[0]=='+' && a[1]=='.'){ //同上 26 s[0]='0'; 27 strcpy(s+1,a+1); 28 f=0; 29 } 30 if(f){ 31 for(int i=0;i<len;i++){ //case 3, 三个或分别对应三种情况00xx,0.xx,0000 32 if(isdigit(a[i]) && a[i]!='0'|| a[i]=='0' && a[i+1]=='.' || a[i]=='0' && a[i+1]==0){ 33 strcpy(s,a+i); 34 break; 35 } 36 } 37 } 38 len=strlen(s); 39 int k=0,m=0,tag=-1; //case 4 xx.xxx000 40 for(int i=0;i<len;i++){ 41 if(s[i]=='.')k=1; //必须去除的是小数点后的零 42 if(k && m==0){ //出现0则标记将要删除的首位置 43 if(s[i]=='0'){ tag=i; m=1;} 44 } 45 if(m==1){ 46 if(s[i]!='0') m=0; //如果下一个不是0,则需要重新标记 47 } 48 } 49 if(tag!=-1 && m!=0){ //如果m=1,那一定没有后置零 50 if(s[tag-1]=='.')s[tag-1]=0; //特殊情况,x.0000 51 else s[tag]=0; 52 } 53 ///////////////////////////////////////////////////////////// 上面下面是一样的 54 len=strlen(b); 55 int pb=1; 56 f=1; 57 if(b[0]=='.') {t[0]='0';strcpy(t+1,b);f=0;} 58 if(b[0]=='-') { 59 pb=0; 60 if(b[1]=='.'){ 61 t[0]='0'; 62 strcpy(t+1,b+1); 63 f=0; 64 } 65 } 66 if(b[0]=='+' && b[1]=='.'){ 67 t[0]='0'; 68 strcpy(t+1,b+1); 69 f=0; 70 } 71 if(f){ 72 for(int i=0;i<len;i++){ 73 if(isdigit(b[i]) && b[i]!='0'|| b[i]=='0' && b[i+1]=='.' || b[i]=='0' && b[i+1]==0){ 74 strcpy(t,b+i); 75 break; 76 } 77 } 78 } 79 len=strlen(t); 80 k=0,m=0,tag=-1; 81 for(int i=0;i<len;i++){ 82 if(t[i]=='.')k=1; 83 if(m==1){ 84 if(t[i]!='0') m=0; 85 } 86 if(k && m==0){ 87 if(t[i]=='0'){ tag=i; m=1;} 88 } 89 } 90 if(tag!=-1 && m!=0){ 91 if(t[tag-1]=='.')t[tag-1]=0; 92 else t[tag]=0; 93 } 94 //printf("%s %s\n",s,t); 95 if(pa!=pb){ 96 if(strcmp(s,"0")==0 && strcmp(t,"0")==0) //case 5 97 printf("It's xiao qiang\n"); 98 else printf("It isn't xiao qiang\n"); 99 } 100 else if(strcmp(s,t)) printf("It isn't xiao qiang\n"); 101 else printf("It's xiao qiang\n"); 102 } 103 return 0; 104 }