⭐⭐⭐⭐⭐PAT A1060 Are They Equal【变态测试数据】

题目描述

在这里插入图片描述

知识点

STL string的用法

实现

码前思考

  1. 对于这种格式转换的题目,最常用的方法就是写很多个 if-else 语句,也就是 分情况,将问题模块化,从宏观的角度上看,这样才不会在一开始分析的时候就陷入代码细节;
  2. 对于这道题,首先可以将数字分为等于0大于0小于1大于等于1三种情况,针对这三种情况分别进行判断即可;
  3. 对于每种情况,我们都要获取两个东西:
    1. 前n个有效位
    2. 指数
  4. 理清上面的思路就很好解题了,主要是代码比较繁琐;

代码实现

//从开头第一个不为0的数字找三个不为'.'的字符(如果有的话) 
//超级好用to_string 
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

int n;
string a,b;
bool eq=false;
string ta,tb;

string transfer(string str){
	string t="0.";
	
	if(str == "0"){
		for(int i=0;i<n;i++){
			t+="0";
		}
		t+="*10^0";
	}else if(str[0] != '.'){//大于等于1的数 
		//寻找前面n个数字(如果有的话) 
		int cnt=0;
		for(int i=0;i<str.size() && cnt<n;i++){
			if(str[i]!='.'){
				t+=str[i];
				cnt++;
			}
		}
		//判断是否找到n个
		if(cnt < n){
			for(int i=0;i<n-cnt;i++){
				t+="0";
			}
		}
		//然后是计算指数
		int exp=0;
		for(int i=0;i<str.size();i++){
			if(str[i]!='.'){
				exp++;
			}else{
				break;
			}
		} 
		t+="*10^";
		t+=to_string(exp);
	}else if(str[0] == '.'){//小于1大于0的数 
		//寻找小数点后面第一个不为0的数
		int exp = 0;
		int idx = 1;
		for(;idx<str.size();idx++){
			if(str[idx]=='0'){
				exp -= 1;
			}else{
				break;
			}
		}
		if(idx==str.size()){
			for(int i=0;i<n;i++){
				t+="0";
			}
			t+="*10^0";		
			return t;	
		}
		//收集后面的n个数字,如果有的话
		int cnt=0;
		for(;idx<str.size()&&cnt<n;idx++){
			t+=str[idx];
			cnt++;
		}
		if(cnt < n){
			for(int i=0;i<n-cnt;i++){
				t+="0";
			}			
		}
		t+="*10^";
		t+=to_string(exp); 
	} 
	
	return t;
} 

int main(){
	cin>>n>>a>>b;
	//去除前导0
	int idx1=0;
	for(;idx1<a.size()-1;idx1++){
		if(a[idx1]!='0')
			break;
	} 
	a = a.substr(idx1);
	int idx2=0;
	for(;idx2<b.size()-1;idx2++){
		if(b[idx2]!='0')
			break;
	}
	b = b.substr(idx2);	 	
	 
	//0如何进行特殊处理 
	ta = transfer(a);
	tb = transfer(b);
	
	if(ta == tb){
		printf("YES ");
		cout<<ta;
	}else{
		printf("NO ");
		cout<<ta<<" "<<tb;
	}
	
	return 0;
} 

码后反思

  1. 这道题有一些比较变态的测试用例,比如测试点4和测试点6:
    2 0012 12
    
    对于这种有前导0的数字要去除前导0才是!
    //去除前导0
    int idx1=0;
    for(;idx1<a.size()-1;idx1++){
    	if(a[idx1]!='0')
    		break;
    } 
    a = a.substr(idx1);
    
    注意上面的边界是a.size()-1,这样是绝对可行的!(可以思考一下~,无论是000,还是000.1都是能得到一个数的)
  2. 此外,0可以表示为0.00,0.000等各种形式,需要特别判断:
    if(idx==str.size()){
    	for(int i=0;i<n;i++){
    		t+="0";
    	}
    	t+="*10^0";		
    	return t;	
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值