CFR Educational 14 C. Exponential notation ( Implementation )
http://codeforces.com/contest/691/problem/C
Well, I thought it was not quite easy, some details need to be wary of.
void solve(){ string s; cin >> s; int _t; // cut off leading zeros for( _t = -1; _t + 1 < s.size(); ++_t ) if( s[ _t + 1 ] != '0' ) break; s = s.substr( _t + 1 ); int p_cnt = -1; // count power of 10s if positive for( int i = 0; i < s.size(); ++i ){ if( s[ i ] == '.' ) break; ++p_cnt; } int dot_pos = s.size(); // get position of dot for( int i = 0; i < s.size(); ++i ) if( s[ i ] == '.' ) dot_pos = i; for( _t = s.size(); _t - 1 >= 0; --_t ) // cut tailing zeros if( s[ _t - 1 ] != '0' ) break; s = s.substr( 0, _t ); int last_non_zero_pos; for( last_non_zero_pos = s.size() - 1; last_non_zero_pos >= 0; --last_non_zero_pos ) if( s[ last_non_zero_pos ] != '0' and s[ last_non_zero_pos ] != '.' ) break; if( last_non_zero_pos == -1 ){ // everything is 0 cout << 0 << "\n"; return; } int first_pos; for( first_pos = 0; first_pos <= last_non_zero_pos; ++first_pos ) if( s[ first_pos ] != '0' and s[ first_pos ] != '.' ) break; cout << s[ first_pos ]; if( first_pos > dot_pos ) p_cnt -= first_pos - dot_pos - 1; // it is a negative power if( first_pos != last_non_zero_pos ) cout << '.'; // not one digit only for( int i = first_pos + 1; i <= last_non_zero_pos; ++i ){ if( s[ i ] == '.' ) continue; cout << s[ i ]; } if( p_cnt ) cout << "E" << p_cnt << "\n"; }