ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

AOJ 2188 Unit Converter

問題文はこちら↓
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2188


・概要
物理とかでよくやるようなやつです。(説明雑)
あとは問題文が日本語なので省略。


・解法
実装するだけです。

まずあらかじめmapなどを用いてyotto、zetta・・・などの10の何乗かというのを保存させておきます。

そのあとは与えられた文字列に小数点があるか、小数点の場所はどこにあるか、などを場合分けして処理していけばできます。

ひとつ注意するとすれば、サンプルの2つ目、
0.000000000000000000000001 yotta grams
これを変換すると、
1 * 10^0 grams
になります。
1.0 * 10^0 grams ではないんですね。


ソースコード

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;

#define rep(i,n) for(int i = 0 ; i < (int)(n) ; i++)

map<string, int> table;

void init(){
   table["yotta"] =  24;
   table["zetta"] =  21;
   table["exa"]   =  18;
   table["peta"]  =  15;
   table["tera"]  =  12;
   table["giga"]  =   9;
   table["mega"]  =   6;
   table["kilo"]  =   3;
   table["hecto"] =   2;
   table["deca"]  =   1;
   table["deci"]  =  -1;
   table["centi"] =  -2;
   table["milli"] =  -3;
   table["micro"] =  -6;
   table["nano"]  =  -9;
   table["pico"]  = -12;
   table["femto"] = -15;
   table["ato"]   = -18;
   table["zepto"] = -21;
   table["yocto"] = -24;
}

int main(){
   init();
   int N;
   cin >> N;
   while(N--){
      int power = 0;
      string s, t;
      cin >> s >> t;
      if(table.find(t)!=table.end()){
	 power = table[t];
	 cin >> t;
      }

      if(s.find(".")==-1){
	 power += s.size()-1;
	 s = s.substr(0,1) + "." + s.substr(1);
      }

      else{
	 int sz = s.size();
	 int index = s.find(".");
	 
	 if(s[0]=='0' && index==1){
	    while(1){
	       power--;
	       index++;
	       if(s[index]!='0')break;
	    }
	    if(index==sz-1)s = s.substr(index,1);
	    else s = s.substr(index,1) + "." + s.substr(index+1);
	 }

	 else if(s[0]!='0' && index==1);

	 else{
	    power += index-1;
	    s = s.substr(0,1) + "." + s.substr(1,index-1) + s.substr(index+1);
	 }
      }
      cout << s << " * 10^" << power << " " << t << endl; 
   }
   return 0;
}