結果

問題 No.81 すべて足すだけの簡単なお仕事です。
ユーザー @abcde@abcde
提出日時 2019-05-12 00:25:15
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 4,677 bytes
コンパイル時間 1,715 ms
コンパイル使用メモリ 175,492 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-07-02 01:26:41
合計ジャッジ時間 2,693 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 WA -
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,944 KB
testcase_07 AC 2 ms
6,944 KB
testcase_08 AC 2 ms
6,944 KB
testcase_09 AC 2 ms
6,948 KB
testcase_10 AC 2 ms
6,944 KB
testcase_11 AC 2 ms
6,940 KB
testcase_12 AC 2 ms
6,940 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 2 ms
6,940 KB
testcase_17 AC 2 ms
6,944 KB
testcase_18 AC 2 ms
6,944 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 WA -
testcase_22 AC 2 ms
6,944 KB
testcase_23 WA -
testcase_24 AC 2 ms
6,940 KB
testcase_25 AC 2 ms
6,940 KB
testcase_26 AC 2 ms
6,940 KB
testcase_27 AC 2 ms
6,940 KB
testcase_28 AC 2 ms
6,944 KB
testcase_29 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

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

int main() {
    
    // 1. 入力情報取得.
    int N;
    cin >> N;
    
    // 2. 加算.
    // ex.
    // 10
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -9999999999.9999999999
    // -> -99999999999.9999928325 は, WAのはず.
    // -> 小数点よりも左側, 右側 を分けて計算する方針に変更.
    long long lAns = 0, rAns = 0;
    for(int i = 0; i < N; i++){
        string s;
        cin >> s;
        
        // 2-1. 符号取得.
        char sign = s[0];
        int pos = s.find(".");
        
        // 2-2. ピリオドある場合, 前半, 後半に分割.
        if(pos != string::npos){
            string l = s.substr(0, pos);
            string r = s.substr(pos + 1, s.size() - pos - 1);
            while(r.size() < 10) r += '0';
            lAns += stod(l);
            if(sign == '-') rAns -= stod(r);
            else            rAns += stod(r);
            // cout << "l=" << l << " r=" << r << " lAns=" << lAns << " rAns=" << rAns << endl;
        }
        
        // 2-3. ピリオドが無い場合.
        if(pos == string::npos) lAns += stod(s);
        
    }
    
    // 3. 編集.
    // 合計値: lAns, rAns の 値をベース に 編集.
    char rSign = (rAns >= 0) ? '+' : '-';
    char lSign = (lAns >= 0) ? '+' : '-';
    string slAns = to_string(lAns);
    string srAns = to_string(rAns);
    if(lSign == '-') slAns.erase(slAns.begin());
    if(rSign == '-') srAns.erase(srAns.begin());
    while(srAns.size() < 10) srAns = '0' + srAns;
    lAns = abs(lAns);
    rAns = abs(rAns);
    // 3-1. (lAns >= 0 && rAns >= 0) もしくは (lAns <= 0 && rAns <= 0) の 場合.
    if((lSign == '+' && rSign == '+') || (lSign == '-' && rSign == '-')){
        string srExAns  = (srAns.size() > 10) ? srAns.substr(0, srAns.size() - 10) : "";
        string srResAns = srAns.substr(srAns.size() - 10, 10);
        long long rExAns  = (srExAns.size() > 0) ? stod(srExAns) : 0;
        lAns += rExAns;
        srAns = srResAns;
        if(lSign == '+') slAns = (lAns == 0) ? "0"  : to_string(lAns);
        if(lSign == '-') slAns = (lAns == 0) ? "-0" : ('-' + to_string(lAns));
        // cout << "3-1. slAns=" << slAns << " srAns=" << srAns << endl;    
    }

    // 3-2. lAns >= 0, rAns < 0 の 場合.
    if(lSign == '+' && rSign == '-'){
        string srExAns  = (srAns.size() > 10) ? srAns.substr(0, srAns.size() - 10) : "";
        string srResAns = srAns.substr(srAns.size() - 10, 10);
        long long rExAns  = (srExAns.size() > 0) ? stod(srExAns) : 0;
        long long rResAns = (srResAns.size() > 0) ? stod(srResAns) : 0;
        if(lAns > rExAns){
            lAns -= rExAns;
            lAns--;
            rAns = 1e10 - rResAns;
            // ex. 1 -> 0000000001 へ変換.
            srResAns = to_string(rAns);
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            if(lAns == 0) slAns = "0";
            else          slAns = to_string(lAns);
        }else{
            rExAns -= lAns;
            lAns = 0;
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            slAns = "-0";
        }
        // cout << "3-2. slAns=" << slAns << " srAns=" << srAns << endl;
    }

    // 3-3. lAns < 0, rAns >= 0 の 場合.
    if(lSign == '-' && rSign == '+'){
        string srExAns  = (srAns.size() > 10) ? srAns.substr(0, srAns.size() - 10) : "";
        string srResAns = srAns.substr(srAns.size() - 10, 10);
        long long rExAns  = (srExAns.size() > 0) ? stod(srExAns) : 0;
        long long rResAns = (srResAns.size() > 0) ? stod(srResAns) : 0;
        if(lAns > rExAns){
            lAns -= rExAns;
            lAns--;
            rAns = 1e10 - rResAns;
            // ex. 1 -> 0000000001 へ変換.
            srResAns = to_string(rAns);
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            if(lAns == 0) slAns = "-0";
            else          slAns = ("-0" + to_string(lAns));
        }else{
            rExAns -= lAns;
            lAns = 0;
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            slAns = to_string(rExAns);
        }
        // cout << "3-3. slAns=" << slAns << " srAns=" << srAns << endl;
    }
    
    // 4. 出力.
    cout << slAns << "." << srAns << endl;
    return 0;
    
}
0