2011-06-28 57 views
-2

我正在寫爲一個大的數字類的自定義碼運算(單數的無限lenghth)問題的除以定製大的數字類(C++)

使用多個遞減NUMER阿當A是由B出現故障除以比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/// 
}; 
+2

這裏有一個問題,甚至是一個問題的說明嗎? – Blazes

+0

+1 @Blazes。如果沒有'?',這不是一個問題。 –

+0

沒有回答你的「問題」,你的代碼的一個問題就是你返回的東西的方式:每個'new'在堆上分配空間,永遠不會再次釋放!內存泄漏。 'operator /'必須按值返回。 – leftaroundabout

回答

2

我想這裏有個問題,也沒有問號。

您嘗試同時解決兩個複雜的任務(這可能會失敗 - 或者已經失敗)。拆分這兩個任務:

  • 管理自由存儲安全列表中的項目(使用std ::清單或std :: vector的;如果你不這樣做,行使僅供參考)
  • 做多倍算術運算(尤其是即使我們在學校瞭解到它也是如此)

對於存儲「4字節位」的std ::向量似乎更好。當它們存儲在列表節點中時,它使用每個數字4個字節代替8個或更多個字節。如果需要,數字變大(a + = b)並縮小時,std :: vector會增長。

對於算術,您還可以分開加號/減號,並首先對非負數進行操作。

加,減,乘相對比較直接。對於部門,我不得不看看唐納德克努特的「計算機程序設計藝術」第2卷(算法算法),並花了兩個星期的時間才弄明白。也許我在這一點上並不擅長。

考慮到,當您乘以2個字節的數字時,您會得到4個字節的數字。否則整數溢出會破壞你的結果。另一種方式是分數。

如果你想看看我的結果在同一教育任務,谷歌我的姓和「Ganzzahl」。但要小心,它沒有經過嚴格測試,用德語編寫,而且自從我在幾年前編寫以來,我認爲它不再被編寫成代碼......

如果您尋找生產代碼解決方案,請嘗試一些庫像GNU多精度整數。