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 ...
随机推荐
- 2019HDU多校第九场 Rikka with Quicksort —— 数学推导&&分段打表
题意 设 $$g_m(n)=\begin{cases}& g_m(i) = 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ...
- 是什么是FBC CBV
- FBV url - 函数 - CBV url - view
- Java Redis+Spring-data-redis 队列 单机版
1.redis.properties ##redisIP地址 #redis.host=10.14.2.212 redis.host=127.0.0.1 ##redis默认端口号 redis.port= ...
- OTFS Research Notes
△f = f·v·cosθ/c,f表示载波频率,5G/B5G朝着毫米波等高频段方向发展,因此多普勒拓展的影响将更显著.此外,Masssive MIMO的现有规模已达256维度,并将朝着上千的规模发展. ...
- 【素数判定/筛法进阶算法】-C++
今天我们来谈一谈素数的判定/筛法. 对于每一个OIer来说,在漫长的练习过程中,素数不可能不在我们的眼中出现,那么判定/筛素数也是每一个OIer应该掌握的操作,那么我们今天来分享几种从暴力到高效的判定 ...
- MongoDB journal 与 oplog,究竟谁先写入?
MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念. journal journal 是 M ...
- Linux disk 100% busy,谁造成的?
disk 100% busy,谁造成的? 2016/11/16 vmunix iostat等命令看到的是系统级的统计,比如下例中我们看到/dev/sdb很忙,如果要追查是哪个进程导致的I/O繁忙,应该 ...
- oom killer 详解
一.oom killer理解和日志分析:知识储备 oom killer日志分析,这是前篇,准备一些基础知识 带着问题看: 1.什么是oom killer 是Linux内核设计的一种机制,在内存不足的时 ...
- 十七.rsync+SSH同步
1. rsync同步操作 • 命令用法 – rsync [选项...] 源目录 目标目录 • 同步与复制的差异 – 复制:完全拷贝源到目标 – 同步:增量拷贝,只传输变化过的数据 • rsyn ...
- defer 和 async 的区别
1. script 没有 defer 和 async 会停止(阻塞)dom 树构建,立即加载,并执行脚本 2. script 带 async 不会停止(阻塞)dom 树构建,立即异步加载,加载好后立即 ...