1060. Are They Equal

浮点数精度问题及解决
本文通过一个具体的编程案例探讨了浮点数在比较过程中遇到的精度问题,并提供了一种解决方案。通过对输入的浮点数进行特定格式的转换,确保了数值的有效比较,解决了因精度丢失而导致的问题。

这一题简直被自己蠢到了。

原来以为是0就直接输出0 最后一个case就是过不了 重写了代码也一样 最后发现我在csdn博客上复制别人代码是 根本没有复制过来 导致我想看别人 0的输出结果 其实在看自己的,最后发现了,将0的输出结果改成 相应格式就对了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<iterator>
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;

void change(char s[],int index,int pindex )
{
    int i=index;
    int j=pindex;
    for( i=index;s[j]!='\0';i++,j++)
        s[i]=s[j];
    s[i]='\0';


}
int non(char s[],int n)
{
    int k=0,j,i,h;
    int length;
    int num=0;
    while(s[k]=='0') k++;//前面是否有多余的零
    if(s[k]=='.')
    {
        h=j=k;
        k++;
          while(s[k]=='0') k++;
          if(s[k]=='\0')//是否为000.000
          {

              s[1]='.';
            for(j=2;j<n+2;j++)
            s[j]='0';
            s[j]='\0';
          }
          else//不是 则是0.0#
          {    num=k-j-1;

             change(s,1,j);//将前面多余的零清除
          //   k-=num;
// printf("1: %s %d %d %d\n",s,num,j,k);
 //3 0000.01000 0000.010000
              if(num>0)
              { k-=j-1;       //将小数点后的零去除 将非零数提前
                  change(s,2,k);
              }
 //printf(" 2: %s\n",s);
             num=-num;
              length=strlen(s);
              if(length-2>n)//小数点后面的数的长度是否大于要比较的位数
                  s[n+2]='\0';
                else if(length<n+2)//小数点后面的位数小于要比较的位数 补零
                    {
                    for(j=length;j<n+2;j++)
                    s[j]='0';
                  s[j]='\0';
                    }
          }
    }
    else if(s[k]=='\0')//是否为000000
        {
            s[1]='.';
            for(j=2;j<n+2;j++)
            s[j]='0';
            s[j]='\0';

        }
    else//是否为 #0.0
    {
        num-=1;
        if(k!=0)//清除前面的零
        {
            for(j=0;s[j+k]!='\0';j++)
                s[j]=s[j+k];
            s[j]='\0';
        }
        k++;
        while(s[k]!='.'&&s[k]!='\0') k++;
        num=k;
        length=strlen(s);
            if(s[k]=='\0')//#00
            {
                if(length>=n)//判断数字长度是否大于等于比较长度
                {
                    for(j=n-1;j>=0;j--)
                        s[j+2]=s[j];
                    s[n+2]='\0';
                }
                else
                {
                   // printf("%d %d\n",length,n+3);
                    for(j=length;j<n+2;j++)
                        s[j]='0';
                    s[j]='\0';

                    for(j=n-1;j>=0;j--)
                        s[j+2]=s[j];
                }
                 s[1]='.';
                    s[0]='0';
            }
            else //#0.0000
            {

                for(j=k-1;j>=0;j--)//将小数位覆盖
                    s[j+1]=s[j];
                    s[0]='0';
                if(length-1>=n)
                {
                    for(j=n+1;j>=1;j--)
                        s[j+1]=s[j];
                    s[n+2]='\0';

                }
                else
                {
                    for(j=length;j<n+2;j++)
                        s[j]='0';
                    s[j]='\0';
                    for(j=n;j>=1;j--)
                         s[j+1]=s[j];
                }

                s[1]='.';
            }
    }
 //printf("%s\n",s);
 return num;
}
/*
 3 0.1236 0.1235
 5 12.50 12.500000
3 00.2 0.200000
3  0.0 0.0
*/
int main()
{
    char a[10001],b[10001];
    int n;

    int length=0;
    scanf("%d%s%s",&n,a,b);

   int ka=non(a,n);
   int kb=non(b,n);
   //printf("%s %s\n",a,b);
   if(ka==kb&&strcmp(a,b)==0)
   {

        printf("YES %s",a);
    //    if(ka!=0)
            printf("*10^%d\n",ka);

   }
   else
   {
       printf("NO %s",a);

        printf("*10^%d",ka);
       printf(" %s",b);
     //  if(kb!=0)
        printf("*10^%d",kb);

   }

        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值