結果

問題 No.81 すべて足すだけの簡単なお仕事です。
ユーザー @abcde@abcde
提出日時 2019-05-12 00:59:16
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 6,202 bytes
コンパイル時間 1,734 ms
コンパイル使用メモリ 172,512 KB
実行使用メモリ 4,384 KB
最終ジャッジ日時 2023-09-29 22:49:14
合計ジャッジ時間 2,756 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

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;
            // -> 以下のテストケースで, WAとなった.
            // 99_system_test3.txt: -481.10000000000
            // 99_system_test4.txt: -71.10000000000
            // -> そもそも, rAns は, 10桁 を 想定しているのに, 上記テストケースで, 
            // 11桁(10000000000)で, 返されたことが分かる.
            if(rAns == 1e10) lAns++, rAns = 0;
            // 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;
            // 6
            // -0.9999999999
            // -0.9999999999
            // -0.9999999999
            // -0.9999999999
            // -0.9999999999
            // 1
            // -> -3.9999999995 にならなかった.
            // bug.
            // lAns = 0;
            lAns = rExAns;
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            if(lAns == 0) slAns = slAns = "-0";
            else          slAns = ("-" + to_string(lAns));
        }
        // 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;
            // -> 以下のテストケースで, WAとなった.
            // 99_system_test3.txt: -481.10000000000
            // 99_system_test4.txt: -71.10000000000
            // -> そもそも, rAns は, 10桁 を 想定しているのに, 上記テストケースで, 
            // 11桁(10000000000)で, 返されたことが分かる.
            if(rAns == 1e10) lAns++, rAns = 0;
            // ex. 1 -> 0000000001 へ変換.
            srResAns = to_string(rAns);
            while(srResAns.size() < 10) srResAns = '0' + srResAns;
            srAns = srResAns;
            if(lAns == 0) slAns = "-0";
            // 以下のテストケースで, WA版となったので, 修正.
            // 04.txt: -09999999999.9999999999
            // 99_system_test3.txt: -0481.10000000000
            // 99_system_test4.txt: -071.10000000000
            // system_test2.txt:    -034600561.4230961320
            // else          slAns = ("-0" + to_string(lAns));
            else          slAns = ("-" + 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