gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

yokicoder No.668 6.0*10^23

問題
No.668 6.0*10^23 - yukicoder
入力の数字をアボガトロ数っぽく書き換えます。

解説

まずは文字列の先頭2文字を引っ張り出して数字に変換します。[a.b*10^c]の形におけるa,bの部分では、四捨五入の対象である入力の先頭2文字しか関係ないからです。

次に先ほど抜き出した数字の四捨五入をするため、文字列の3文字目(s[2])を見ます。これが5以上なら、xに1足し、5未満なら何もしません。xに1を足すという行為が、49.9→50や99.7→100のように四捨五入することで繰り上がる動作にもうまく対応しています。

次に操作後のxを再び文字列に変数名ssとして変換します。
このとき、[a.b*10^c]におけるa,bの部分が、ss[0],ss[1]に対応します。また、cは(ssの長さ+sの長さ−3)となります。−3である理由は、sとssの重複を無くすための−2と、100=1.0*10^2のような具体例で分かるように、さらに−1するからです。100は3文字ですが、10^2のようにcの部分は2です。

#include <iostream>
#include <vector>
#include <string>

#define rep(i,j,k) for(int i=(int)j;i<(int)k;i++)

using namespace std;


int main(){
    string s;
    cin>>s;
    int x=stoi(s.substr(0,2));
    if(s[2]-'0'>4)x++;
    
    string ss=to_string(x);
    cout<<ss[0]<<'.'<<ss[1]<<'*'<<"10^"<<ss.length()+s.length()-3<<endl;
    
    return 0;
}