PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)
If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered equal since they are both saved as 0 with simple chopping. Now given the number of significant digits on a machine and two float numbers, you are supposed to tell if they are treated equal in that machine.
Input Specification:
Each input file contains one test case which gives three numbers N, A and B, where N (<) is the number of significant digits, and A and B are the two float numbers to be compared. Each float number is non-negative, no greater than 1, and that its total digit number is less than 100.
Output Specification:
For each test case, print in a line YES if the two numbers are treated equal, and then the number in the standard form 0.d[1]...d[N]*10^k (d[1]>0 unless the number is 0); or NO if they are not treated equal, and then the two numbers in their standard form. All the terms must be separated by a space, with no extra space at the end of a line.
Note: Simple chopping is assumed without rounding.
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
题意:
给出两个数,问:将他们写成保留N (<100)位小数的科学计数法 0.d[1]...d[N]*10^k (d[1]>0 unless the number is 0); 后,是否相同。若相等,输出YES,并转换结果; 如果不相等,输出NO,并给出两个数的转换结果。
题解:
本题的思路难想而且情况判断非常复杂。
题目要求科学计数法时,两个数是否相等。因此只要判断科学技术法时的本体部分以及指数部分是否相等即可。
对于数据来说,要分为大于 1 与小于 1 来判断,要考虑各种情况下的数字,比如:0000, 000.00, 00123.4, 0.012, 0.00 等
一开始没有考虑太多的异常情况,拿了19分,第二天看了题解的注意点重做,还是只有21分,
第三天理了理思路,其实,只要关注,格式化好后的小数点要点在哪里,次数是多少就可以了,在此基础上,特判0,去掉前导零。比较的时候注意不要超限,输出不够0补齐。
自己编的测试样例:
0.0015 0000.001520000
YES 0.15*^-
010.25 0010.23
YES 0.102*^
0.1 00.100
YES 0.10000*^
000.0012 0000000.0012000000000
YES 0.1200000000*^-
0.000
YES 0.000*^
AC代码:
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
char a[];
char b[];
int main(){
cin>>n>>a>>b;
int la=strlen(a);
int lb=strlen(b);
int sta=-,stb=-;
int isa0=,isb0=;//特判是不是0 //从第一个不是0的数开始
for(int i=;i<la;i++){
if(a[i]!='.'&&a[i]!=''){
sta=i;
break;
}
}
for(int i=;i<lb;i++){
if(b[i]!='.'&&b[i]!=''){
stb=i;
break;
}
}
if(sta==-) isa0=;
if(stb==-) isb0=; //小数点前有几位
int ia=,ib=;
int f=;
for(int i=;i<la;i++){
if(a[i]=='.') break;
if(a[i]!='') f=;
if(f){
ia++;
}
}
f=;
for(int i=;i<lb;i++){
if(b[i]=='.') break;
if(b[i]!='') f=;
if(f){
ib++;
}
}
//cout<<"sta:"<<sta<<" ia:"<<ia<<" ha:"<<ha<<endl;
//cout<<"stb:"<<stb<<" ib:"<<ib<<" hb:"<<hb<<endl; //比较
f=;
int pa=sta,pb=stb;
if(isa0!=isb0 || ia!=ib) f=;
for(int i=;i<n;i++){
if(pa+i>=la||pb+i>=lb) break;
if(a[pa]=='.') pa++;
if(b[pb]=='.') pb++;
//cout<<"pa "<<pa+i<<" a[pa] "<<a[pa+i]<<endl;
//cout<<"pb "<<pa+i<<" b[pb] "<<b[pa+i]<<endl;
if(a[pa+i]!=b[pb+i]){
f=;
break;
}
}
if(isa0==&&isa0==isb0) f=;//如果两个都是0 //输出
if(f){
cout<<"YES 0.";
if(isa0==){//0的特判
for(int i=;i<=n;i++) cout<<"";
cout<<"*10^0";
}else{
pa=sta;
for(int i=;i<n;i++){
if(pa+i>=la) {
cout<<"";
continue;
}
if(a[pa+i]=='.') pa++;
if(pa+i>=la) cout<<"";
else cout<<a[pa+i];
}
cout<<"*10^";
if(ia!=) cout<<ia;//次数>=于0
else{//次数<0
int k=-;
for(int i=;i<la;i++){
if(a[i]=='.'){
k=i;
break;
}
}
cout<<k-sta+;//.的位置-开始的位置+1
}
}
}else{//同上
cout<<"NO 0.";
if(isa0==){
for(int i=;i<=n;i++) cout<<"";
cout<<"*10^0 ";
}else{
for(int i=;i<n;i++){
if(pa+i>=la) {
cout<<"";
continue;
}
if(a[pa+i]=='.') pa++;
if(pa+i>=la) cout<<"";
else cout<<a[pa+i];
}
cout<<"*10^";
if(ia!=) cout<<ia<<" 0.";
else{
int k=-;
for(int i=;i<la;i++){
if(a[i]=='.'){
k=i;
break;
}
}
cout<<k-sta+<<" 0.";
}
}
if(isb0==){
for(int i=;i<=n;i++) cout<<"";
cout<<"*10^0";
}else{
for(int i=;i<n;i++){
if(pb+i>=lb) {
cout<<"";
continue;
}
if(b[pb+i]=='.') pb++;
if(pb+i>=lb) cout<<"";
else cout<<b[pb+i];
}
cout<<"*10^";
if(ib!=) cout<<ib;
else{
int k=-;
for(int i=;i<lb;i++){
if(b[i]=='.'){
k=i;
break;
}
}
cout<<k-stb+;
}
}
}
return ;
}
PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)的更多相关文章
- 1060 Are They Equal (25 分)
1060 Are They Equal (25 分) If a machine can save only 3 significant digits, the float numbers 1230 ...
- 1060 Are They Equal (25分)
1060 Are They Equal (25分) 题目 思路 定义结构体 struct fraction{ string f; int index; } 把输入的两个数先都转换为科学计数法,统一标准 ...
- PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...
- 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)
题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...
- 【PAT】1060 Are They Equal (25)(25 分)
1060 Are They Equal (25)(25 分) If a machine can save only 3 significant digits, the float numbers 12 ...
- PAT 甲级 1060 Are They Equal
1060. Are They Equal (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If a ma ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- PAT 甲级 1083 List Grades (25 分)
1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...
- PAT甲级——1130 Infix Expression (25 分)
1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...
随机推荐
- cvte2018春招前端开发实习面试分享
编程题问题描述: 返回整数数组中出现次数第n多的数字(返回值可能有多个) 最近在找实习,面试二面最后出了一道这样的编程题,当时有思路但语法有错误,而且很紧张,最后没有运行出来,导致凉凉,回来重新思考了 ...
- 必备的JS调试技巧汇总
转自http://www.jb51.net/article/88891.htm 前言:任何一个编程者都少不了要去调试代码,不管你是高手还是菜鸟,调试程序都是一项必不可少的工作.一般来说调试程序是在编写 ...
- MyBatis 接口注解方式代替mapper.xml
https://blog.csdn.net/m0_38068812/article/details/86566929 spring boot(8)-mybatis三种动态sql 或者 这个 1. 代 ...
- sql server select 1 from 的作用
select 1 from table 语句中的1代表什么意思 在这里我主要讨论的有以下几个select 语句: doo_archive表是一个数据表,表的行数为4行,如下: 分别用三条selec ...
- Mysql开启慢查询命令
; 查询: SHOW VARIABLES LIKE '%slow_query_log%'; 结果:
- ajax案例_校验用户名
目录 ajax案例_校验用户名 代码下载 需求 流程 搭建环境 开发代码 1_jsp 1_servlet 1_service.dao 2_servlet 2_jsp 测试后,功能实现,完结撒花 aja ...
- 链家网爬虫同步VS异步执行时间对比
异步执行时间 import time import asyncio import aiohttp from lxml import etree start_time = time.time() asy ...
- 用win-acme给windows服务器添加SSL(Let's Encrypt)证书
本文是我今天用win-acme给windows服务器添加SSL(Let's Encrypt)证书的一个过程,主要是给我自己备忘的. 1.首先先在github上下载最新版的win-acme. 下载地址: ...
- SSM框架的配置Spring+Springmvc +Mybatis
ssm框架是由spring mvc +spring+mybatis组成 快速阅读 通过spring的配置文件spring.xml,在servlet中指定spring mvc的配置文件spring-mv ...
- java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射 ...