Project Euler 13

http://projecteuler.net/index.php?section=problems&id=13


1要素で1桁を表す多倍長整数クラスを適当にでっちあげた。

// longint.h
#include <iostream>
#include <vector>
#include <string>

class longint {
    std::vector<int>    v;
    
public:
    longint() {
        v.push_back(0);
    }
    longint(const std::string& str) {
        for(int k = 0; k < (int)str.length(); k++)
            v.push_back(str.c_str()[k] - '0');
        std::reverse(v.begin(), v.end());
    }
    longint(int n) {
        if(n == 0) {
            v.push_back(0);
        }
        else {
            while(n) {
                v.push_back(n % 10);
                n /= 10;
            }
        }
    }
    longint& operator +(const longint& a) {
        longint c = *this;
        return c += a;
    }
    longint& operator +=(const longint& a) {
        if(length() >= a.length()) {
            int r = 0;
            for(int k = 0; k < a.length(); k++) {
                v[k] += a.v[k] + r;
                if(v[k] >= 10) {
                    v[k] -= 10;
                    r = 1;
                }
                else {
                    r = 0;
                }
            }
            for(int k = a.length(); k < length(); k++) {
                v[k] += r;
                if(v[k] >= 10) {
                    v[k] -= 10;
                    r = 1;
                }
                else {
                    r = 0;
                }
            }
            if(r == 1)
                v.push_back(1);
        }
        else {
            int r = 0;
            for(int k = 0; k < length(); k++) {
                v[k] += a.v[k] + r;
                if(v[k] >= 10) {
                    v[k] -= 10;
                    r = 1;
                }
                else {
                    r = 0;
                }
            }
            for(int k = length(); k < a.length(); k++) {
                int n = r + a.v[k];
                if(n >= 10) {
                    v.push_back(n - 10);
                    r = 1;
                }
                else {
                    v.push_back(n);
                    r = 0;
                }
            }
            if(r == 1)
                v.push_back(1);
        }
        return *this;
    }
    int length() const {
        return (int)v.size();
    }
    int at(int k) const {
        return v[k];
    }
};

std::ostream& operator <<(std::ostream& os, const longint& a) {
    for(int k = a.length() - 1; k >= 0; k--)
        os << a.at(k);
    return os;
}
#include <sstream>
#include "longint.h"

int main() {
    using namespace std;
    
    char    *a[] = {
        "37107287533902102798797998220837590246510135740250",
        "46376937677490009712648124896970078050417018260538",
        ...
        "53503534226472524250874054075591789781264330331690",
    };
    
    int size = sizeof(a) / sizeof(char *);
    longint n = 0;
    for(int k = 0; k < size; k++) {
        n += longint(a[k]);
    }
    
    ostringstream   ss;
    ss << n;
    cout << ss.str().substr(0, 10) << endl;
}