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