1060 Are They Equal (25 分)
 

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天,考虑要全面,坑点多,真麻烦)的更多相关文章

  1. 1060 Are They Equal (25 分)

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  2. 1060 Are They Equal (25分)

    1060 Are They Equal (25分) 题目 思路 定义结构体 struct fraction{ string f; int index; } 把输入的两个数先都转换为科学计数法,统一标准 ...

  3. PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)

    PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...

  4. 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)

    题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...

  5. 【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 ...

  6. PAT 甲级 1060 Are They Equal

    1060. Are They Equal (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If a ma ...

  7. PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

    1040 Longest Symmetric String (25 分)   Given a string, you are supposed to output the length of the ...

  8. PAT 甲级 1083 List Grades (25 分)

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...

  9. PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...

随机推荐

  1. Ajax的简单例子——PHP

    PHP PHP是一种创建动态交互性站点的服务器端脚本语言 PHP能够生成动态页面内容 PHP能够创建.打开.读取.写入.删除以及关闭服务器上的文件 PHP能够接收表单数据 PHP能够发送并取回cook ...

  2. 第119题:杨辉三角II

    一. 问题描述 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 二. 解题思路 ...

  3. nginx动静分离配置

    动静分离: 所谓动静分离指的是当访问静态资源时,路由到一台静态资源服务器,当访问是非静态资源时,路由到另外一台服务器 静态资源配置: 如配置如下location 表示url为  /static/*.x ...

  4. Mysql 双主--keepalived

    简介 编辑 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作 ...

  5. Oracle RAC 服务启动流程

    启动流程步骤层次梳理:第一层:OHASD 启动: cssdagent - 负责启动 CSSD 的 Agent.orarootagent - 负责启动所有 root 用户下的 ohasd 资源 的Age ...

  6. PHP安装与配置

    一.官网下载 进入PHP下载地址http://windows.php.net/download下载最新线程安全版(Thread Safe)PHP zip压缩包,解压缩后放在想要安装的路径下.我这里下载 ...

  7. leetcode解题报告(20):Rotate Array

    描述 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the arr ...

  8. NCNN使用总结

    目录 NCNN简介 NCNN注意事项 NCNN使用心得 小技巧 小想法 NCNN简介 ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架.ncnn 从设计之初深刻考虑手机端的部署和使用.无第 ...

  9. ROS理解参数服务器param demo

    param 是一个字典,存储一些变量 param_demo.cpp #include<ros/ros.h> int main(int argc, char **argv){ ros::in ...

  10. codeforces193B

    CF193B Xor sol:发现好像非常不可做的样子,发现n,u都很小,大胆dfs,因为异或偶数次毫无卵用,只要判每次是否做2操作就是了,复杂度O(可过) #include <bits/std ...