PAT 1060 Are They Equal[难][科学记数法]
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×105 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 10100, 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[难][科学记数法]的更多相关文章
- PAT 1060. Are They Equal
If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered ...
- 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 ...
- 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 ...
- 【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 ...
- 1060 Are They Equal——PAT甲级真题
1060 Are They Equal If a machine can save only 3 significant digits, the float numbers 12300 and 123 ...
- 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甲级1060 Are They Equal【模拟】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872 题意: 给定两个数,表示成0.xxxx ...
随机推荐
- shell脚本中,for基于列表进行循环的实现方法
需求描述: 在写脚本中需要这么个需求,需要对一个列表中的值进行循环 比如,列表中的值mysqld,zookeeper,hbase 简单来说,for基于列表值的循环. 脚本测试过程: 1.测试脚本 #! ...
- 超全面的JavaWeb笔记day07<Java基础加强>
1.myeclipse安装和使用(**) 2.debug调试模式(**) - F6: 单步执行 - F8:结束断点,后面有断点到下一个断点 3.myeclipse快捷键(**) 4.junit单元测试 ...
- Effective C++ Item 16 Use the same form in corresponding uses of new and delete
1. When you created an array and want to return the memory to system. You need to explicitly add [] ...
- 十大Material Design开源项目
介于拟物和扁平之间的Material Design自面世以来,便引起了很多人的关注与思考,就此产生的讨论也不绝于耳.本文详细介绍了在Android开发者圈子里颇受青睐的十个Material Desig ...
- C++11新特性之二——std::bind std::function 高级用法
/* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include <iostream> #includ ...
- 使用React写的一个小小的登录验证密码组件
哎,算了.直接上代码吧,不懂得私聊我把 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- web基础----->模板引擎Velocity的使用(一)
Velocity 是一个基于 Java 的模板引擎框架,提供的模板语言可以使用在 Java 中定义的对象和变量上.今天我们就学习一下Velocity的用法. Velocity的第一个例子 项目的主体是 ...
- 使用Sublime Text 3做Python开发
引言 刚转到OS X平台时,寻找写Python,JavaScript,Markdown等文件的工具时,比较了许多工具, 最终选择了Sublime Text 2,主要原因是其跨平台, 想着以后再转到wi ...
- 图片的ScaleType详解 ImageView的属性android:scaleType,
imageView.setScaleType(ImageView.ScaleType.FIT_XY ); 这里我们重点理解ImageView的属性android:scaleType,即ImageVie ...
- Java的Object.hashCode()的返回值到底是不是对象内存地址?
关于这个问题,查阅了网上的资料,发现证明过程太繁琐,这里我用了反证法. java.lang.Object.hashCode()的返回值到底是不是对象内存地址? hashCode契约 说到这个问题,大家 ...