1060 Are They Equal

Posted keep23456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1060 Are They Equal相关的知识,希望对你有一定的参考价值。

大致题意就是给出两个浮点数A,B,首先把它们按 0.(有效数字)*10^(指数) 表示,并且都保留N位有效数字。

最后判断A,B是否相等。

有效数字是指从左边第一个不是0的数开始计数。如果长度不够,则末尾补零。

假设下面的浮点数都保留三位有效数字
00.00123表示为0.123*10^(-2)
000012.3表示为0.123*10^(2)
00.0 表示为0.000*10^(0)。

/*STL使用的注意点
vector,string,set,map可以根据指向某个元素的迭代器it,删除这个元素。
set可以根据某个元素的值删除这个元素。
map可以根据某个元素的键删除这个元素。
*/

#include"iostream"
#include"algorithm"
using namespace std;
int n;//有效数字位数 string deal(string s,int& e) {//处理浮点数,得到有效数字,以及指数 while(s.length() > 0 && s[0] == 0) { //删除前导零 s.erase(s.begin()); } //如果删除前导零以后的字符串的第一个字符是小数点,那么继续删除非零数前面的前导零,并且每删除一个前导零,指数减一 //如00.00123 if(s[0] == .) { //删除这个小数点 s.erase(s.begin()); while(s.length() > 0 &&s[0] == 0) { s.erase(s.begin()); e--; } } else { //如000012.3, int k = 0; for(k; k < s.length(); ++k) {//查找小数点,并且指数++ if(s[k] == .) break; else e++; } if( k < s.length()) { //找到小数点就删除 s.erase(s.begin()+k); } } //如果删除所有前导零,结果为0,如0000.000,那么指数为0,有效位数为 0.0(...) if(s.length() == 0) { e = 0; } //比如00.00123,经过前面处理以后成为123,保留4位有效数字 s = s.substr(0,n);//substr(pos,len);结果还是123 int len = n - s.length(); while(len--) { s+=0;//有效位不足,末尾补零 } return s; } int main() { int e1 =0 ,e2 = 0;//初始指数为0 scanf("%d",&n); string s1,s2; cin>>s1>>s2; s1 = deal(s1,e1); s2 = deal(s2,e2); if(s1 == s2 && e1 == e2) {//如果两个浮点数的有效位数和指数数值相同,那么它们等价 printf("YES 0.%s*10^%d",s1.c_str(),e1); } else { printf("NO 0.%s*10^%d 0.%s*10^%d",s1.c_str(),e1,s2.c_str(),e2); } return 0; }

 

以上是关于1060 Are They Equal的主要内容,如果未能解决你的问题,请参考以下文章

1060. Are They Equal (25)

1060. Are They Equal (25)

1060. Are They Equal (25)

1060 Are They Equal (25 分)

PAT 1060. Are They Equal

PTA(Advanced Level)1060.Are They Equal