我正在为一个大数字级别编写一个自定义算术(单个数字的无限长度)
当A比B大得多时,使用多个递减数字A除以B失败。 我正在尝试实现书面分工,但我发现在我的情况下它太复杂了。
我无法在字符串中存储数字(这是项目的主要限制),因此我将它们存储在int列表中的4位数组中。 我试着把它看作是整个4位数结构在流行的书面部门中是一个数字,但我在实施过程中因为重载/运算符而迷失了。
如果我做的最后一个主要部分是正确的,我想得到一个暗示吗?如果分成这个类,我该如何改进方法?
struct Node{
int value;
Node* next,*prev;
};
class number {
public:
Node* head;
number(); //konstruktor domyślny
~number(); //destruktor
void addNode(string str); //dodanie nowego wezla na poczatek liczby
void addNode(int str); //dodanie nowego wezla na poczatek liczby (z wartosci int)
number& operator+(number& licz); //operator dodawania
number& operator-(number& licz); //operator odejmowania
bool operator>(number& licz); //operator porównania (czy a > b)
bool operator<(number& licz); //operator porównania (a mniejsze od b)
bool operator==(number& licz); //operator porównania (czy a równe b)
number& operator=(const number& licz); //operator przypisania
number& operator-(); //operator zamiany liczby na przeciwną
friend istream& operator>>(istream& input,number& li); //operator pobierania liczby
friend ostream& operator<<(ostream& s,number& li); //operator wypisania
void validate(); //funkcja usuwajaca zera z poczatku liczby
number& operator/(number& licz); //dzielenie calkowitoliczbowe
number& operator*(number& licz); //mnożenie
void pushNode(int str);
};
number& number::operator/(number& licz)
{
/////////cases of dividing//////
if (this->head->value<0 && licz.head->value<0) {
return (-(*this))/(-licz);
}
if (this->head->value<0 && licz.head->value>0) {
return -((-(*this))/licz);
}
if (this->head->value>0 && licz.head->value<0) {
return -(*this/(-licz));
}
number tmp_this=*this;
number tmp_licz=licz;
number zero;
zero.addNode(0);
//dividing by zero//
if (licz==zero) {
cout<<"dividing by zero"<<endl;
number* t=new number;
t->addNode(0);
return *t;
}
//dividing zero by sth ///
if (*this==zero) {
number* t=new number;
t->addNode(0);
return *t;
}
number i,jeden;
i.addNode(0);
jeden.addNode(1);
if (licz == jeden) {
return *this;
}
/// here real mess start///
string pl="";
number* tmp=new number;
Node* p=this->head,*q=licz.head;
tmp->pushNode(q->value);
while (p && *tmp < licz) {
p=p->next;
tmp->pushNode(p->value);
}
number* wynik=new number;
wynik=tmp;
int j;
while (*wynik > zero || *wynik==zero) {
*wynik=*wynik-tmp_licz;
j++;
}
char* str;
sprintf(str, "%d", j);
///end od mess///
};
答案 0 :(得分:2)
我想这里有一个问题,也没有问号。
您尝试同时解决两个复杂的任务(这可能会失败 - 或者已经失败)。拆分这两项任务:
为了存储“4字节数字”,std :: vector似乎更好。当将它们存储在列表节点中时,它使用每个数字4个字节而不是8个或更多。当数字变大(a + = b)并且如果需要缩小时,std :: vector可以增长。
对于算术运算,您还可以将加号/减号分开并首先对非负数进行操作。
加,减和乘法相对简单。对于师,我不得不关注Donald Knuth的“计算机编程艺术”Vol.2(基础数学算法),并有两周的时间来弄明白。也许我在这一点上并不是特别擅长。
考虑到,当乘以2个字节数时,您会得到4个字节的数字。否则整数溢出会破坏您的结果。另一种方法是划分数字。
如果你想查看我在同一教育任务上的结果,谷歌的姓氏和“Ganzzahl”。但要注意,它没有经过严格测试,用德语编写,而且自从我几年前写完以来,我不再认为它编写得很好......
如果您正在寻找生产代码解决方案,请尝试使用GNU多精度整数等库。