1060 Are They Equal (25分)测试点4和6

一开始写的很累赘,是因为相同功能没有用函数实现
关于各个测试点:
1⃣️测试点4:

1 00.01 0.010
结果:YES 0.1*10^-1

2⃣️测试点6:有效数字不够末尾补0

5 00.01 0.0001
结果:NO 0.10000*10^-1 0.10000*10^-3

字符串最前面没用的0可以用erase去掉,注意去除后各元素位置也会移动。

#include<iostream>
#include<string>
using namespace std;
int size1=0,size2=0;
int k(string s)
{
    int i,size=0;
     if(s[0]=='0'&&s[1]=='.')    //处理0.xxx格式的小数
    {
        i=2;
        while(s[i++]=='0')         
            size--;
        i--;                          //最后一次判断使得i指向不为0的下一位
        if(s[i]=='\0')             //处理0.0...0格式小数
            size=0;
    }
    else if(s[0]=='0'&&s[1]=='\0')   //处理 0
        size=0;
    else
    {
    for(i=0;i<s.size();i++)       //处理xx.xxx小数或xxxxx整数
    {
        if(s[i]!='.')
            size++;
        else 
            break;
    }       
    }
    return size;
}
void print(string s,int a,int size)
{
        int i=0;
        cout<<"0.";
        for(int j=0;j<a;j++)
        {
           if(s[i]=='.'&&s[0]!=0)    //xx.xx格式小数,小数点前是有效数字
           {
               j--;
               i++;
               continue;      
           }
           else if(s[i]!='\0')
           {
               if(i==0&&s[i]=='0'&&s[i+1]=='.')  //0.xxx格式小数,小数点前不是有效数字
               {
                   j--;
                   i=i+2;
                   while(s[i]=='0')
                       i++;
                   continue;
               }
               else
                   cout<<s[i++];
           }
           if(s[i]=='\0')
           {
               for(;j<a-1;j++)
                   cout<<0;
                break;
            }
        }
        cout<<"*10^"<<size;
}
int main()
{
    int a,i=0,j=0,b=0,c=0,d=0;
    string s[2];
    string::iterator it;
    cin>>a>>s[0]>>s[1];
    it=s[0].begin();
    while(s[0][i]=='0'&&s[0][i+1]!='.'&&s[0][i+1]!='\0')   //去掉数字前面多余的0;
    {s[0].erase(it);}
    it=s[1].begin();
    while(s[1][j]=='0'&&s[0][j+1]!='.'&&s[1][j+1]!='\0') 
    {s[1].erase(it);}
    size1=k(s[0]);
    size2=k(s[1]);
    i=0;              //判断有效数字部分是否相同
    j=0;
    for(int count=0;count<a;count++)
    {
        if(s[0][i]=='.')    //遇到小数点跳过并且不算有效数字
        {
            i++;
            count--;
            continue;
        }
        if(s[1][j]=='.')
        {
            j++;
            count--;
            continue;
        }
        if(s[0][0]=='0'&&s[1][0]=='0'&&s[0][1]!=s[1][1])      //不相同的四种情况
            b=1;
        if(s[0][i]!='\0'&&s[1][j]!='\0'&&s[0][i++]!=s[1][j++])
            b=1;
        if(s[0][i]=='\0'&&s[1][j]!='0'&&s[1][j]!='\0')
            b=1;
        if(s[0][j]=='\0'&&s[1][i]!='0'&&s[0][i]!='\0')
            b=1;
    }
    if(b==1||size1!=size2)
    {
        cout<<"NO ";
    }
    else
        cout<<"YES ";
    print(s[0],a,size1);
    if(b==1||size1!=size2)
    {   cout<<' ';
        print(s[1],a,size2);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值