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.d1...dN*10^k" (d1>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
这个题目的难点在于要处理的数不一定都是大于1的,还可能出现0.015这样的数字,我之前的代码只能处理大于1的情况,后来参考了小5555的代码,发现可以用两个游标指示小数点和第一个非0数的位置,然后判断二者的位置关系来判断数的值。
首先定义一个结构体,来存储基数和次方:
struct result{
char d[MAX]; // 0.xxx部分
int k; // 10的k次方
};
然后设计一个函数,对于输入的数字(存储在char*内)数组进行遍历。
遍历时定义firstPos记录第一个非0数,pointPos记录小数点位置。
需要注意以下问题:
①题目的case似乎出现了00123.45这种坑爹的情况,因此要处理无效的0,也就说开头出现的0是不能要的,只有碰到第一个非0才记录firstPos。
②对于题目给定的精度,如果输入的数字位数不够,要补0,在结尾处还要补\0使得字符串可靠结束。
③处理完毕后,对于firstPos和pointPos做比较,如果前者小,说明是大于1的数,pointPos - firstPos即为10的几次方;如果后者小,说明是小数,应该用firstPos - pointPos + 1,+1是因为firstPos越过了小数点,而小数点不能算作一位,注意的是这个次方是负值。
④比较相等时,如果基数部分一致、次方也一致,才算相等。
代码如下:
#include <stdio.h>
#include <string.h>
#define MAX 110
struct result{
char d[MAX]; // 0.xxx部分
int k; // 10的k次方
}; result getResult(char *a, int n){
result r;
int firstPos = -1;
int pointPos = -1;
int index = 0;
int i;
for (i = 0; a[i]; i++){
if (a[i] == '.'){
pointPos = i;
continue;
}
else if (a[i] == '0' && firstPos == -1) // 不能以0开头,否则忽略
continue;
else{
if (firstPos == -1)
firstPos = i; // 第一个非0数字的位置
if (index < n)
{
if (index < strlen(a))
r.d[index++] = a[i]; // 对于特定的精度,有数字则填入相应数字,没有则补0
else
r.d[index++] = '0';
}
}
}
r.d[index] = 0; // 在数字结尾加\0,防止越界
if (pointPos == -1)
pointPos = i; // 如果没有找到小数点,则小数点在最后,这是个纯整数
if (pointPos - firstPos < 0) // 判断小数点与第一个非0数字的位置关系,计算10的几次方
r.k = - (firstPos - pointPos - 1); // 负次方,例如0.015,pointPos = 1, firstPos = 3, 3 - 1 - 1 = 1, -1是因为多算了小数点进去,0.15*10^-1
else
r.k = pointPos - firstPos; // 正次方,例如21.25,pointPos = 2,firstPos = 0,2-0=2,0.2125*10^2
if (index == 0){ // 如果index = 0,代表值为0,则每一位都写0,再加\0
int i;
for (i = 0; i != n; i++)
r.d[i] = '0';
r.d[i] = 0;
r.k = 0;
}
return r;
} int main(){
int n;
char a[MAX], b[MAX];
scanf("%d%s%s", &n, a, b);
result r1 = getResult(a, n);
result r2 = getResult(b, n);
if (strcmp(r1.d, r2.d) == 0 && r1.k == r2.k)
printf("YES 0.%s*10^%d\n", r1.d, r1.k);
else
printf("NO 0.%s*10^%d 0.%s*10^%d\n", r1.d, r1.k, r2.d, r2.k);
return 0;
}
1060. Are They Equal (25)的更多相关文章
- 【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 (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)
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 分) 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 (25)
题目意思直接,要求将两个数转为科学计数法表示,然后比较是否相同 不过有精度要求 /* test 6 3 0.00 00.00 test 3 3 0.1 0.001 0.001=0.1*10^-2 p ...
- PAT (Advanced Level) 1060. Are They Equal (25)
模拟题.坑点较多. #include<iostream> #include<cstring> #include<cmath> #include<algorit ...
- PAT甲题题解-1060. Are They Equal (25)-字符串处理(科学计数法)
又是一道字符串处理的题目... 题意:给出两个浮点数,询问它们保留n位小数的科学计数法(0.xxx*10^x)是否相等.根据是和否输出相应答案. 思路:先分别将两个浮点数转换成相应的科学计数法的格式1 ...
- 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)
题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...
- PAT 甲级 1060 Are They Equal
1060. Are They Equal (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If a ma ...
随机推荐
- jieba库分词统计
代码在github网站,https://github.com/chaigee/chaigee,中的z3.py文件 py.txt为团队中文简介文件 代码运行后词频统计使用xlwt库将数据发送到excel ...
- jquery easyui datagrid改变某行的值
$("#DeterminateMembers").datagrid("updateRow",{index:index,row:{fzr:"0" ...
- vue环境搭建过程中,遇到的坑爹的问题
1,在配置package.json下载node依赖包时,执行$cnpm install过程中,这个过程是比较漫长的,尤其的这种core i5配置的电脑,简直有点卡的人怀疑人生,后来动了下有消息输出,我 ...
- C语言 字符串 字符串处理操作 字符串与函数
字符数组的定义和初始化 宏常量+1 强调了字符串的最大强度 推荐忽略长度的定义 不能对所指向的存储单元内容修改,除非是字符串数组的定义 因为指针变量指向的是字符串数组的值,可以被修改. 未初始化 字 ...
- JAX-RPC 与 JAX-WS 的比较
引言 Web 服务已经出现很久了.首先是 SOAP,但 SOAP 仅描述消息的情况,然后是 WSDL,WSDL 并不会告诉您如何使用 Java™ 编写 Web 服务.在这种情况下,JAX-RPC 1. ...
- web性能优化之--合理使用http缓存和localStorage做资源缓存
一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...
- 对闭包的理解(closure)
什么是闭包: 当你声明一个局部变量时,这个局部变量有作用域,通常局部变量值只存在于你定义的Block or Function中: function() { var a = 1; console.log ...
- Sublime Text3时间戳查看转换插件的开发
平常配置表中,经常需要用到时间配置,比如活动开始结束.从可读性上,我们喜欢2017-04-27 17:00:00,从程序角度,我们喜欢用1493283600.前者是包含时区概念的,而后者市区无关,所以 ...
- oclazyload的尝试
https://oclazyload.readme.io/docs http://www.cnblogs.com/BestMePeng/p/AngularJS_ocLazyLoad.html 模块依赖 ...
- swing JTable 更新数据
rowData 是将要更新的表格内数据,coloumnName是将要更新的表头数据. table是原本的table对象,更新数据的时候要用 DefaultTableModel 类~ /*更新table ...