• HDU 2054 A == B ?


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054

    此题卡数据,卡爆所有数据,

    例如下面数据包括其他的都得成立:

    0012. 12.
    .25 .25000
    . .
    12.1000001 0012.10000010000
    01200 0001200
    012. 012.0000
    .025 0000.0250000000000000000000000000000000
    0.0 0.
    .0 .0000
    00000000000000000000000001 1.0000000000000000000000
    005. 05.00000000000000

    第一次提交居然WA,实在无语,只好决定把数组都扩大10倍,再交就AC了,彻底无语了!强悍的测试数据~~

    代码如下:

    #include <iostream>
    using namespace std;
    #include<string.h>
    #include<ctype.h>
    char a[100000],b[100000],a1[50000],a2[50000];//a1存整数部分(和小数点). a2存小数部分.
    void convert(char s[])
    {
        int i,j,k,k1,k2,l,p1=1,m=0,k3;
        int pre=0,post=0;//点前面 点后面是否有数字 做标记
        l=strlen(s);
        
        for(i=0;i<l;i++)
        if(s[i]=='.')//判断有没有小数点
        {
            p1=0;
            k=i;
            break;
        }
        if(p1)//没小数点
        {
            for(i=0;i<l;i++) //全部为n个0的情况
             if(s[i]!='0')
             {
                 k1=i;
                 break;
             }
            if(i==l)strcpy(s,"0");
            else
            {
             j=0;
            for(i=k1;i<l;i++)
             a1[j++]=s[i]; 
            a1[j]='\0'; 
            strcpy(s,a1);
            }
        }
        else//有小数点  分四种情况:点前面有数、没数和点后有数、没数
        {
            if(isdigit(s[0]))pre=1;
            if(s[k+1]!='\0')post=1;
            if(pre==0&&post==0)
                strcpy(s,"0");
            else if(pre==1&&post==0)
            {
                for(i=0;i<k;i++)
                 if(s[i]!='0')
                 {
                     k1=i;
                     break;
                 }
                if(i==k)strcpy(s,"0");
                else
                {
                    k2=0;
                    for(i=k1;i<l-1;i++)
                     a1[k2++]=s[i];
                     a1[k2]='\0';
                     strcpy(s,a1);
                } 
            }
            else if(pre==0&&post==1)
            {
                strcpy(a1,"0.");
                for(i=k+1;i<l;i++)
                 if(s[i]!='0')a2[m++]=s[i];
                 else
                 {
                  for(j=i+1;j<l;j++)              
                      if(s[j]!='0')break;
                      if(j!=l)a2[m++]=s[i];
                 }
                 a2[m]='\0';
                strcat(a1,a2); 
                strcpy(s,a1);      
            }
            else 
            {
                //求整数部分
                for(i=0;i<k;i++)
                if(s[i]!='0')
                 {
                     k1=i;
                     break;
                 }
                if(i==k)
                {
                    strcpy(a1,"0");
                    k3=1;   //记录a1的长度 等会可能要在后面加个小数点
                }
                else
                {
                 j=0;
                for(i=k1;i<k;i++)
                 a1[j++]=s[i]; 
                 a1[j]='\0';     
                 k3=j;        
                }
    
                //求小数部分
                for(i=k+1;i<l;i++)
                  if(s[i]!='0')break;
                if(i==l)
                    strcpy(s,a1);
                else
                {
                    k2=0;
                    for(i=k+1;i<l;i++)
                    {
                        if(s[i]!='0')a2[k2++]=s[i];
                        else
                        {
                        for(j=i+1;j<l;j++)
                         if(s[j]!='0')break;
                        if(j!=l)a2[k2++]=s[i]; 
                        }
                        a2[k2]='\0';                
                    }
                    a1[k3++]='.';
                    a1[k3]='\0';
                    strcat(a1,a2);//写到了上一个for里面 运行时发现错误并改正
                    strcpy(s,a1);
                }
            }//else
        }//else
        
    }
    int main()
    {
        //freopen("d:\\1.txt","r",stdin);
        while(scanf("%s%s",a,b)!=EOF)
        {
        int l1,l2;    
        convert(a);
        convert(b);
        l1=strlen(a);
        l2=strlen(b);
        //printf("l1=%d l2=%d\n%s\n%s\n",l1,l2,a,b);
        if(l1!=l2)cout<<"NO"<<endl;
        else
        { 
        for(int i=0;i<l1;i++)
         if(a[i]!=b[i])break;
         if(i==l1)cout<<"YES"<<endl;
         else cout<<"NO"<<endl;
        }
        }
        return 0;
    }
  • 相关阅读:
    EMC研究院电面记
    被百度放了鸽子
    最长严格递增子序列算法
    括号配对问题
    RTP 协议
    C++ 纯虚函数, 记上一笔!
    一年又一年
    direct3d Colorkey 应用.
    CEGUI 中文输入与显示
    被遗忘的C,记录一笔
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2477108.html
Copyright © 2020-2023  润新知