0w1

Yuki 81 すべて足すだけの簡単なお仕事です。( __int128 )

No.81 すべて足すだけの簡単なお仕事です。 - yukicoder
__int128 のいい練習になった、普通に面倒な問題。
最大 11 + 10 桁あるから __int128 を使わざるを得ません。
まずは 10^10 を掛ければ色々と簡単になります。

__float128 の使い方は知らないな...、もっと簡単なのかも。調べてみても最後は諦めた。

#include <bits/stdc++.h>
using namespace std;

signed main(){
  int N; cin >> N;
  vector< __int128 > A( N );
  for( int i = 0; i < N; ++i ){
    string S; cin >> S;
    int neg = S[ 0 ] == '-';
    if( neg ) S = S.substr( 1 );
    for( int j = 0; j < S.size(); ++j ){
      if( S[ j ] == '.' ){
        S = S.substr( j );
        break;
      }
      A[ i ] = A[ i ] * 10 + S[ j ] - '0';
    }
    if( S[ 0 ] == '.' ) S = S.substr( 1 );
    else S = "";
    for( int j = 0; j < S.size(); ++j )
      A[ i ] = A[ i ] * 10 + S[ j ] - '0';
    for( int j = 0; j < 10 - S.size(); ++j )
      A[ i ] = A[ i ] * 10; 
    if( neg ) A[ i ] *= -1;
  }
  __int128 sum = 0;
  for( int i = 0; i < N; ++i )
    sum += A[ i ];
  int neg = 0;
  if( sum < 0 ) sum *= -1, neg = 1;
  string ans;
  while( sum )
    ans += ( char ) ( '0' + sum % 10 ),
    sum /= 10;
  reverse( ans.begin(), ans.end() );
  if( ans.size() <= 10 )
    ans = "0." + ans;
  else
    ans = ans.substr( 0, ans.size() - 10 ) + "." + ans.substr( ans.size() - 10 );
  if( neg ) cout << "-";
  cout << ans << endl;
  return 0;
}