Пожалуйста, ознакомьтесь с этим кодом и сообщите, почему оператор + = работает только в том случае, если номера имеют одинаковый размер, когда я пытался x += z;
i
получил 345678
.Оператор класса Bigint
Я думаю, что проблема int for (i = 0; i <= len - 1; i++)
loop. Я попытался это исправить, но мне не удалось. Любые решения?
Файл заголовка.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Mint {
public:
Mint();
Mint(int);
Mint (const char *s);
string afficher();
Mint operator+=(const Mint &rhs); //returns mint + rhs
Mint operator+(const Mint &rhs);
private:
vector<char> num;
};
Исходный файл.
#include "Mint.h"
#include <string.h>
Mint::Mint()
{
num.push_back(0);
}
Mint::Mint(int n)
{
while(n!=0)
{
num.push_back(n%10);
n = n/10;
}
}
Mint::Mint(const char* s)
{
int i = 0 ;
for(i=strlen(s)-1;i>=0;i--)
num.push_back(s[i] - '0');
}
string Mint::afficher(){
string s="";
int i;
for(i=num.size()-1;i>=0;i--)
s += char('0'+num[i]);
return s;
}
Mint Mint::operator+=(const Mint &rhs) {
unsigned int len = num.size();
char carry = 0;
if (len > rhs.num.size())
len = rhs.num.size();
unsigned int i;
for (i = 0; i <= len - 1; i++)
{
char result = num[i] + rhs.num[i] + carry;
num[i] = result % 10;
carry = result/10;
}
while (carry)
{
if (i < num.size())
{
num[i] += carry;
if (num[i] >= 10)
{
num[i] -= 10;
i++;
}
else
carry = 0;
}
else {
num.push_back(carry);
carry = 0;
}
}
return *this;
}
Mint Mint::operator+(const Mint &rhs){
Mint result;
result = *this;
return result+=rhs;
}
main
файл.
#include "Mint.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
Mint x="123456",z="22222222222222222222",f;
Mint a = "655478461469974272005572";
Mint b = 8;
x += z;
f = x + z;
cout << x.afficher()<<endl;
}
Что вы видите, когда запускаете его в отладчике? –
Если len == 0, то len -1 может стать максимальным значением unsigned int – I3ck
'operator + =' должно возвращать * ссылку * на текущий объект, а не на новый объект. Это должно быть: 'Mint & Mint :: operator + = (const Mint & rhs)' – PaulMcKenzie