0w1

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";
}