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;
}
posted @ 2012-04-30 19:09  龙杉老师  阅读(458)  评论(0编辑  收藏  举报