PAT A1060 Are They Equal

题目难度:三颗星
题目大意:给出两个数,需要写出其科学计数法,并保留给定的位数,最后判断两个数是否相等。
题目坑点:老实说,写了半天 写错了,然后,没办法看了算法笔记的答案,只能说 思维还不够。
思路:对于输入的小数,可以分成0.。。。。和整数.小数两种,第一种和第二种的情况都需要:利用循环去掉数值开始前的零的元素。如果去除零之后紧跟着的是小数点,那么就是零点多少的形式,那么就开始数小数点之后的零的个数,每有一个零 就是10的负多少次方;如果去除先导零之后不是小数点,那么就要看整数部分距离小数点有几位,就循环找小数点,退出循环之后,如果k的定位是小于原来的长度的,那么就删除掉小数点。
需要注意的是,在去除掉小数点之后,需要判断第一种情况中的,去掉零之后是否就完全都没有了,那么此时的e指数就是0,而不是负数。
最后开始将科学计数法的小数部分堆起来,如果上面剩下的数字还有就加上去,如果没有,那么就加上0,保留精度。

希望之后再回顾一下,这种题目,其实没啥难度,但是可能程序写的不好就变得很复杂,类似于模拟题,难在逻辑。

代码如下:

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int N;
string to_form(string A,int &e){
	int k=0;
	while(A.length()>0&&A[0]=='0')
		A.erase(A.begin());
	if(A[0]=='.'){
		A.erase(A.begin());
		while(A.length()>0&&A[0]=='0'){
			A.erase(A.begin());
			e--;
		}
	}
	else{
		while(k<A.length()&&A[k]!='.'){
			e++;
			k++;
		}
		if(k<A.length())
			A.erase(A.begin()+k);
	}
	if(A.length()==0){
		e=0;
	}
	int num=0;
	k=0;
	string res;
	while(num<N){
		if(k<A.length())
			res+=A[k++];
		else
			res+="0";
		num++; 
	}
	return res;
}
int main(){
	string A,B;
	cin>>N>>A>>B;
	int e1=0,e2=0;
	A=to_form(A,e1);
	B=to_form(B,e2);
	if(A==B&&e1==e2){
		cout<<"YES 0."<<A<<"*10^"<<e1<<endl;
	}
	else{
		cout<<"NO 0."<<A<<"*10^"<<e1<<" 0."<<B<<"*10^"<<e2<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值