zoukankan      html  css  js  c++  java
  • EOJ2032 判断两个数是否相等

    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 }
    View Code
  • 相关阅读:
    Activiti7工作流+SpringBoot
    他为何放弃580万年薪 拿月薪500元跟马云创业(眼光毒辣,半年的机会损失不算大,大不了再干会本行)
    周鸿祎在360新员工入职培训上的讲话(他们都是太聪明,把自己混失败了。大家一定要记住,混日子就是在糜费自己的时间。假设你不喜欢360,你一定要尽快换,尽快找到自己喜欢的事情)
    Apache多虚拟主机多版本PHP(5.3+5.6+N)共存运行配置全过程
    估值800亿的小米,宣布正式进军欧洲市场
    英特尔投资:7200万美元投资12家创新公司,包括3家中国公司(www.intelcapital.com)
    应用监控Metrics
    六大原则理
    PostgreSQL
    CAP原理和BASE思想
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3132397.html
Copyright © 2011-2022 走看看