题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872
思路
- 不管原来的数怎么样,最后一定是变成0.XXXXX*10^X的形式,这样我们只要把主体和指数求出来就行了。
- 然后又分为两种情况,一种是整数部分大于0的情况,另外一种是整数部分为0的情况,然后还要根据情况,去除先导零
- 整数部分为0时,本体就是小数点后面n位非零位,指数部分就是非零位到小数点的0的个数
- 整数部分不为0时,本体是前n位非零位,指数则是小数点之前非零位的个数
代码
#include<string>#include<algorithm>#include<iostream>using namespace std;int n;string change(string a, int &e){//去除前导零int k = 0;while(a.size() > 0 && *a.begin() == '0'){a.erase(a.begin());}////////////////////////////////////////////////////////////if(a[0] == '.'){//整数部分为0a.erase(a.begin());while(a.length() > 0 && a[0] == '0'){//去掉小数点后面的0a.erase(a.begin());e--;}}////////////////////////////////////////////////////////////else {while(k < a.length() && a[k] != '.'){//去除前导零以后寻找后面的小数点k++;e++;}if(k < a.length()){//遇到了小数点a.erase(a.begin() + k);//把小数点擦了}}////////////////////////////////////////////////////////////if(a.length() == 0){//擦了0和小数点以后没有了,说明原来的数就是0e = 0;}int num = 0;k = 0;string res;while(num < n){if(k < a.length()) res += a[k++];else res += '0';num++;}return res;//res是本体部分}int main(){string a, b, ac, bc;scanf("%d", &n);cin>>a>>b;int ea = 0, eb = 0;ac = change(a, ea);bc = change(b, eb);if (ac == bc && ea == eb){cout<<"YES 0."<<ac<<"*10^"<<ea<<endl;}else cout<<"NO 0."<<ac<<"*10^"<<ea<<" 0."<<bc<<"*10^"<<eb<<endl;return 0;}
