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.123×10​5​​ 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 (<100) 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 10​100​​, 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位的浮点数,判断它们在机器中是否是相同的存储。

//一开始想用字符数组,但是在字符数组中查找小数点的位置还要遍历,不如使用string直接find方便。

#include <iostream>
#include<stdio.h>
#include<cmath>
#include<vector>
using namespace std; int main() {
int n;
string s1,s2;
cin>>n;
cin>>s1>>s2;
int len1,len2;
int pos=s1.find(".");
pos==string::npos?len1=s1.size():len1=pos;
pos=s2.find(".");
pos==string::npos?len2=s2.size():len2=pos; string temp1=s1.substr(,n);
string temp2=s2.substr(,n); if(len1!=len2){
cout<<"NO ";
cout<<"0."<<temp1<<"*10^"<<len1<<" ";
cout<<"0."<<temp2<<"*10^"<<len2;
}else{
if(temp1==temp2){
cout<<"YES ";
cout<<"0."<<temp1<<"*10^"<<len1;
}
else{
cout<<"NO ";
cout<<"0."<<temp1<<"*10^"<<len1<<" ";
cout<<"0."<<temp2<<"*10^"<<len2;
}
} return ;
}

//提交一次之后,没有通过,牛客网上报错:

测试用例:
99 0 0.000

对应输出应该为:

YES 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*10^0

你的输出为:

NO 0.0*10^1 0.0.000*10^1

//但是我发现我不知道怎么处理,我写的这个bug存在问题,

//看了大佬的代码之后发现,我对科学计数法并不太明白。

代码来自:https://www.liuchuo.net/archives/2293

#include <iostream>
#include <cstring>
#include<stdio.h>
using namespace std;
int main() {
int n, p = , q = ;
char a[], b[], A[], B[];
scanf("%d%s%s", &n, a, b);
int cnta = strlen(a), cntb = strlen(b);
for(int i = ; i < strlen(a); i++) {//居然真的是遍历,我还以为需要字符串那样呢。
if(a[i] == '.') {
cnta = i;
break;
}
}
for(int i = ; i < strlen(b); i++) {
if(b[i] == '.') {
cntb = i;
break;
}
} while(a[p] == '' || a[p] == '.') p++;//找到不为0的位置。
while(b[q] == '' || b[q] == '.') q++;
if(cnta >= p)//这个小数点出现在非0位之后,如123.45,指数就为cnta-p=3
cnta = cnta - p;
else//小数点后仍有0位,如0.0002,那么指数就是负值,
cnta = cnta - p + ;
if(cntb >= q)
cntb = cntb - q;
else
cntb = cntb - q + ;//
if(p == strlen(a))//如果是0.000这样的形式,将其赋值为0.
cnta = ;//不置为0,有可能两个0判断不相等。
if(q == strlen(b))
cntb = ;
int indexa = , indexb = ;
while(indexa < n) {
if(a[p] != '.' && p < strlen(a))//除了小数点以外都赋值,
A[indexa++] = a[p];
else if(p >= strlen(a))//当遍历完后,n较大时,仍然不够n位,那么后n位补0
A[indexa++] = '';
p++;
}
while(indexb < n) {
if(b[q] != '.' && q < strlen(b))
B[indexb++] = b[q];
else if(q >= strlen(b))
B[indexb++] = '';
q++;
}
if(strcmp(A, B) == && cnta == cntb)
printf("YES 0.%s*10^%d", A, cnta);//读入和输出字符数组都可以用%s.
else
printf("NO 0.%s*10^%d 0.%s*10^%d" , A, cnta, B, cntb);
return ;
}

//深刻地学习了科学记数法

1.科学记数法有两个重要的因素,就是小数点的位置,和首位非0位的位置,通过这两个可以确定指数,

2.小数点的位置,怎么办呢?先初始化位字符串长度,对应整数,没有小数位。

3.首位非0的元素也初始化为字符串的长度。

4.需要注意的是如果首位非零元长度=字符串长度,那么这个字符串表示的数就是0.需要特殊处理,就是为0.0..0*10^0。否则计算指数。

5.科学记数法如果不是0,那么处理后的结果,小数点后边一定要是非0元!。

学习了!

PAT 1060 Are They Equal[难][科学记数法]的更多相关文章

  1. PAT 1060. Are They Equal

    If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered ...

  2. pat 1060. Are They Equal (25)

    题目意思直接,要求将两个数转为科学计数法表示,然后比较是否相同  不过有精度要求 /* test 6 3 0.00 00.00 test 3 3 0.1 0.001 0.001=0.1*10^-2 p ...

  3. PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)

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

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

  5. PAT 甲级 1060 Are They Equal

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

  6. 1060 Are They Equal——PAT甲级真题

    1060 Are They Equal If a machine can save only 3 significant digits, the float numbers 12300 and 123 ...

  7. 1060 Are They Equal (25 分)

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

  8. 1060 Are They Equal (25分)

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

  9. PAT甲级1060 Are They Equal【模拟】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872 题意: 给定两个数,表示成0.xxxx ...

随机推荐

  1. 帝国留言板管理员回复发送EMAIL通知客户

    说明:修改1:e/admin/tool/ReGook.php   /*回复表单*/ 43行处添加代码 ------------------------------------------------- ...

  2. C#------Entity Framework6的T4模板的使用

    转载: http://www.cnblogs.com/Zhangzhigang/articles/4850549.html 1.新建一个.tt文件 2.打开.tt文件 3.粘贴入以下代码即可(inpu ...

  3. mybatis由浅入深day01_ 7输入映射(7.1传递pojo的包装对象_7.2#{}与${}_7.3传递简单类型_7.4传递pojo对象_7.5传递hashmap)

    7 输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 7.1 传递pojo的包装对象 7.1.1 需求 完成用户信息的综合查询,需要 ...

  4. html5 file 自定义文件过滤

    使用 acctpe属性即可 示例: gif,jpg <input type="file" name="pic" accept="image/gi ...

  5. linux解压和压缩

    1.压缩命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar  -z ...

  6. source insight 如何建工程--以及快捷方式查找调用函数方法

    在source insight的view菜单中点出relation window,然后右键点relation window,选relation window properties,然后把view re ...

  7. (三)微信小程序之发送服务通知(模板消息)

    1.后端获取AccessToken返回给微信端 微信小程序端请求后端得到AccessToken   2.后端获取openid返回给微信端   微信小程序端登录请求后端得到openid   3.发送消息 ...

  8. C++模板实战6:迭代器

    1 迭代器的类型: 输入迭代器 .前向迭代器.双向迭代器.跳转迭代器以及输出迭代器.这五种迭代器的限制条件从左至右越来越强. 2 输入迭代器需满足的条件: X u(a); X可复制构造 u=a; 可赋 ...

  9. LeetCode——Submission Details

    Description: Given a string of numbers and operators, return all possible results from computing all ...

  10. CRUX下实现进程隐藏(3)

    通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...