У меня странный лимит с моим типом данных. Ничего не объясняя, я просто покажу вам.
Это класс.
class vecmath
{
private:
std::vector<int> avec;
public:
vecmath(std::string b);
vecmath(std::vector<int>);
~vecmath();
vecmath add(vecmath b);
vecmath mult(vecmath b);
vecmath prod(vecmath b);
void read();
std::string write();
std::vector<int> getVec();
vecmath operator+(vecmath a);
vecmath operator*(vecmath a);
};
Это конструктор, который используется.
vecmath::vecmath(std::string b) {
for (unsigned long long i = 0; i < b.length(); ++i) {
avec.push_back((int)(b[i]) - 48);
}
}
Это функция добавления. Он вызывается в функции operator +, которая просто возвращает его.
vecmath vecmath::add(vecmath b) {
std::vector<int> cbvec = b.getVec();
std::vector<int> cavec = avec;
if (cavec.size() > cbvec.size()) {
std::swap(cbvec, cavec);
}
std::vector<int> ret;
unsigned long long asize = cavec.size();
unsigned long long bsize = cbvec.size();
std::reverse(cavec.begin(), cavec.end());
std::reverse(cbvec.begin(), cbvec.end());
int carry = 0;
for (unsigned long long i = 0; i < asize; ++i) {
int sum = (cavec[i] + cbvec[i] + carry);
ret.push_back(sum % 10);
carry = sum / 10;
}
for (unsigned long long i = asize; i < bsize; ++i) {
int sum = (cbvec[i] + carry);
ret.push_back(sum % 10);
carry = sum / 10;
}
if (carry) {
ret.push_back(carry);
}
std::reverse(ret.begin(), ret.end());
return vecmath(ret);
}
Это функция, которая вычисляет произведение по 2 векторам (1 в самом классе).
vecmath vecmath::prod(vecmath b) {
vecmath ret("0");
std::vector<int> cbvec = b.getVec();
std::vector<int> cavec = avec;
if(cavec.size() > cbvec.size()) {
std::swap(cavec, cbvec);
}
unsigned long long asize = cavec.size();
unsigned long long bsize = cbvec.size();
std::reverse(cavec.begin(), cavec.end());
std::reverse(cbvec.begin(), cbvec.end());
for(unsigned long long i = 0; i < asize; ++i) {
for (unsigned long long j = 0; j < bsize; ++j) {
ret = ret + vecmath(std::to_string(cavec[i] * cbvec[j] * nfzehnhoch(i) * nfzehnhoch(j)));
}
}
return ret;
}
Это функция nfzehnhoch.
unsigned long long nfzehnhoch(unsigned int n) {
unsigned long long ret = 1;
for(unsigned int i = 0; i < n; ++i) {
ret *= 10;
}
return ret;
}
Это моя основная функция.
int main(void) {
vecmath a("2");
vecmath c("2");
for(int i = 1; i <= 100; ++i) {
std::cout << c.write() << ", " << std::endl;
c = c * a;
}
std::string end;
std::getline(std::cin, end);
}
Это то, что я получаю, когда запускаю его.
2,
4,
8,
16,
32,
64,
128,
256,
512,
1024,
2048,
4096,
8192,
16384,
32768,
65536,
131072,
262144,
524288,
1048576,
2097152,
4194304,
8388608,
16777216,
33554432,
67108864,
134217728,
268435456,
536870912,
1073741824,
2147483648,
4294967296,
8589934592,
17179869184,
34359738368,
68719476736,
137438953472,
274877906944,
549755813888,
1099511627776,
2199023255552,
4398046511104,
8796093022208,
17592186044416,
35184372088832,
70368744177664,
140737488355328,
281474976710656,
562949953421312,
1125899906842624,
2251799813685248,
4503599627370496,
9007199254740992,
18014398509481984,
36028797018963968,
72057594037927936,
144115188075855872,
288230376151711744,
576460752303423488,
1152921504606846976,
2305843009213693952,
4611686018427387904,
9223372036854775808,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
18446744073709551616,
Как видите, он застрял на 18446744073709551616. Может быть, кто-то просто взглянет на него и узнает.
Спасибо за любую помощь.