PAT 1060 Are They Equal

该博客介绍了PAT 1060题目,主要利用C++中string的方法处理数字串,包括.length(), .begin(), .erase()等,讨论了如何处理不同形式如0.0123、00123.456等的数字串进行比较。" 131971437,5694251,K均值聚类与形态学算法在叶片病虫害检测中的应用,"['算法', '聚类', 'matlab', '图像处理', '机器学习']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  •  本题运用的string中的.length(),.begin(),.erase()等方法;
  • 本题思想是把数字串存为字符,对字符进行预处理和处理,依据字符形式进行相应的处理,例如0.0123、00123.456等数字。

Sample Input 1:

3 12300 12358.9

Sample Output 1:

YES 0.123*10^5

Sample Input 2:

3 120 128

Sample Output 2:

NO 0.120*10^3 0.128*10^3

 

Sample Output 3:

4 0000 0000.00 //YES 0.0000*10^0
4 00123.5678 001235
3 0.0520 0.0521
4 00000.000000123 0.0000001230
5 0010.013 10.012
4 123.0678 123

 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
 int n;

string deal(string s, int &e){
	int k = 0;
	while (s.length() > 0 && s[0] == '0')//去掉前导0
	{
		s.erase(s.begin());
	}
	if (s[0] == '.')//如果这个数原来是小于1的,例如0.0123,去掉前导0之后字符串变成.0123,去掉.;
	{
		s.erase(s.begin());
		while (s.length() > 0 && s[0] == '0')//去掉小数点之后,若被预处理之后的字符串还有0,则继续去掉,不过要数个数,方便指数e元素的赋值;
		{
			s.erase(s.begin());
			e--;//每去掉一个0,e就自减一次;
		}
	}
	else {
		while (k < s.length() && s[k] != '.')//如果原来的数为00123.456;
		{
			k++; e++; //去掉前导0之后为123.456,寻找小数点位置,并记录一共有多少位数;
		}
		if (k < s.length())
		{
			s.erase(s.begin() + k);
		}//若有小数点,找到并去除小数点;
	}
	if (s.length() == 0) e = 0;
	
	int i = 0; string res;

	int num = 0;
	/*while (num < n)
	{
		if ( i< s.length()) res += s[i++];
		else res += "0";
		num++;
	}*/  //给出的简便方法,大家可以选择;
	
	if (n <= s.length()) //这个方法比较好懂,不过理解起来费些脑子;
	{
		for (i = 0; i < n; i++)
		{
			res += s[i];
		}
	}
	else{
		for (i = 0; i < s.length(); i++)
		{
			res += s[i];
		}
		for (i = 0; i < n-s.length(); i++)
		{
			res += '0';
		}
	}
	
	return res;
}

int main(){
	string s1, s2, s3, s4;
	cin >> n >> s1 >> s2;
	int e1=0, e2=0;
	s3 = deal(s1, e1);
	s4 = deal(s2, e2);
	if (s3 == s4&&e1 == e2)
	{
		cout << "YES 0." << s3 << "*10^" << e1 << endl;
	}
	else{
		cout << "NO 0." << s3 << "*10^" << e1<<" 0." << s4 << "*10^" << e2 << endl;
	}
	system("pause");
	return 0;

}
#include<iostream>
#include<string>
using namespace std;
int n;
string predeal(string str,int& k){
	while(str[0]=='0'){
		str.erase(str.begin());
	}
	k=0;//
	if(str[0]=='.'){
		str.erase(str.begin());
		while(str[0]=='0'){
			k--;
			str.erase(str.begin());
		}
	}
	else{
		while(k<str.length()&&str[k]!='.')
		{
			k++;
		}
		if(str[k]=='.') str.erase(str.begin()+k);
	}
	if(str.length()==0){
		str='0';
		k=0;
	}
	string res;
	int num=0,temp=0;
	while(num<n)
	{
		if(temp<str.length()) res+=str[temp++];
		else res+='0';
		num++;
	}
	return res;
}

int main(){
	int k,kk;
	string a,aa,b,ab;
	cin >> n >>a>>b;
	aa=predeal(a,k);
	ab=predeal(b,kk);
	if(aa==ab&&k==kk){
		cout<<"YES "<<"0."<<aa<<"*10^"<<k<<endl;
	}
	else{
		cout<<"NO "<<"0."<<aa<<"*10^"<<k<<" 0."<<ab<<"*10^"<<kk<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值