Joh, jeg kan da give dig en lille smule hjælp til at lave en type til store tal. Det kræver en god del tænkning, men det går.
En simpel implementation kunne se sådan her ud, du har selvfølgelig brug for flere operators, da jeg kun har skrevet +=.
Jeg har heller ikke kompileret præcis denne version, så typos osv. er der måske.
Header:
typedef unsigned long byteblock; // Nemmere at skrive disse
typedef std::vector<byteblock>::iterator iter;
typedef std::vector<byteblock>::reverse_iterator riter;
typedef std::vector<byteblock>::const_iterator citer;
typedef std::vector<byteblock>::const_reverse_iterator criter;
class Largenum
{
public:
Largenum();
Largenum& operator+=(const Largenum&);
std::vector<byteblock> data;
};
C++:
Largenum::Largenum()
{
}
Largenum& Largenum::operator+=(const Largenum& l2);
{
data.resize(std::max(data.size(), l2.data.size()), 0);
bool overflow = false;
iter mit = data.begin();
for(citer anden = l2.data.begin(), end = l2.data.end(); anden != end; ++mit, ++anden)
{
byteblock toadd = *anden;
if(overflow)
{
if(toadd == std::numeric_limits<byteblock>::max()) continue;
++toadd;
overflow = false;
}
byteblock overflowm1 = std::numeric_limits<byteblock>::max() - toadd;
if(*mit <= overflowm1)
{
*mit += toadd;
}
else
{
overflow = true;
*mit -= overflowm1;
--(*mit);
}
}
if(overflow)
{
iter end = data.end();
while(mit != end)
{
if(*mit != std::numeric_limits<byteblock>::max())
{
++(*mit);
return *this;
}
else
{
*mit = 0;
++mit;
}
}
data.push_back(0);
}
return *this;
}
Redigeret:
Nu når jeg lige læste posten igen, syntes jeg lige jeg ville hjælpe med at finde nogle store primtal.
[code]void Largenum::power(const Largenum& l2)
{
Largenum power(1);
unsigned most_significant = other.get_most_significant_bit_set(); // Den funktion må du lige selv lave, den er simpel
for(unsigned long bit = 1; bit <= most_significant; ++bit, *this *= *this)
{
if(other.is_bit_set(bit)) // Endnu en funktion du selv må skrive
power *= *this;
}
data.swap(power.swap);
}
Indlæg senest redigeret d. 05.04.2006 11:31 af Bruger #9792