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 ...
随机推荐
- 利用socketserver模块的简单功能来完成一个多线程消息传递
客户端:客户端的代码无需改动 import socket client = socket.socket() client.connect(("127.0.0.1",8777)) w ...
- Pycharm----【Mac】设置默认模板
使用场景:新建的文件中,有某些字段或者代码段是每次都需要写入的,因此为了编写的方便,我们会创建对应的模板,每次新建选择模板即可. 操作步骤如下: pycharm--->preference--- ...
- 31、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
31.[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
- 服务器nginx配置显示文件而不是下载
有时候在服务器上配置某些文件比如TXT文件,在浏览器打开的时候,会弹出下载.如何只让他在浏览器中显示,而不是下载呢.在nginx配置文件中添加一行代码 add_header Content-Type ...
- LaTex编译时出错:PK font *** could not be created
参考https://blog.csdn.net/dancing11/article/details/60978642 在用TeXworks (Miktex) 编译OSA投稿模板时,遇到错误PK fon ...
- js-清空array数组
两种实现方式: 1.splice:删除元素并添加新元素,直接对数组进行修改,返回含有被删除元素的数组. arrayObject.splice(index,howmany,element1,....., ...
- Greenplum 执行计划之广播与重分布
关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...
- 洛谷P1006 传纸条(多维DP)
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们 ...
- Firefox 英文改中文
小书匠kindle 在Linux上安装好Firefox后,想进设置界面个性化一下,想看看浏览历史,无奈Linux上默认的Firefox是英文设置界面的,对于我种强迫症不能忍. 刚开始还在设置界面下搜索 ...
- List集合类
1.1: List.add方法——向集合列表中添加对象 public static void main(String[] args) { List<String> list=new Ar ...