题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1060
注意几点:(题目都没说清楚,坑)
1.有前导0的情况 例如:
3 00000012.3 0000001.1
NO 0.123*10^2 0.11*10^1
2.还有就是当位数不足N位时,不需要补全 , 如上的 0000001.1
3.0的不同表示:如:
5 0000000 0000000.000000
YES 0.00000*10^0
其实这题有些搞笑, 如下:
4 00000012.0 0000012.00
NO 0.120*10^2 0.1200*10^2
同样是0.12不相等。。。 纯字符串比较,题目要求不删除小数部分的后导0
我的思路:integer函数 算出整数部分有几位,process函数 处理字符串 使其变成0.xxx*10^的格式,最后联合比较就行。
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int integer(string s) 6 { 7 if(s.find_first_not_of('0') == string::npos) 8 return 0; 9 else 10 { 11 int pos=s.find_first_not_of('0'); 12 if(s[pos] == '.') 13 { 14 int i=pos+1; 15 while(i != s.length()) 16 { 17 if(s[i] == '0') 18 ++i; 19 else 20 break; 21 } 22 if(i == s.length()) 23 return 0; 24 else 25 return -(i-pos-1); 26 } 27 else 28 { 29 int i=pos; 30 while(i != s.length()) 31 { 32 if(s[i] != '.') 33 ++i; 34 else 35 break; 36 } 37 return i-pos; 38 } 39 } 40 } 41 42 string process(string s, int N) 43 { 44 int num=N; 45 string s1("0."); 46 int i=0; 47 for(; i<s.length(); ++i) 48 if(s[i] != '0' && s[i] != '.') 49 { 50 for(int j=i; j<s.length()&&j<i+N; ++j) 51 { 52 if(s[j] == '.') 53 ++N; 54 else 55 s1.push_back(s[j]); 56 } 57 break; 58 } 59 if(i == s.length()) 60 { 61 string s2(num, '0'); 62 s1 += s2; 63 } 64 return s1+"*10^"; 65 } 66 67 int main() 68 { 69 int N; string A, B; 70 while(cin>>N>>A>>B) 71 { 72 string a=process(A,N); 73 string b=process(B,N); 74 int ai=integer(A); 75 int bi=integer(B); 76 if(a == b && ai == bi) 77 cout<<"YES "<<a<<ai<<endl; 78 else 79 cout<<"NO "<<a<<ai<<" "<<b<<bi<<endl; 80 } 81 return 0; 82 }