Groot getal opsplitsen

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 20 jul 2012, 09:35

Wat ik heb is het volledige getal opgeslagen in een variable.. dat heb ik gedaan door de losse getallen steeds toe te voegen aan een variable en het daarna te vermenigvuldigen door 10. Daarna hoef ik de variable alleen nog maar te delen en het fractionele gedeelte keer 256 te doen. Het fractionele deel sla ik apart op en als het hele getal opgesplitst is hoef ik het alleen nog maar op te slaan, zodat ik het later weer kan uitlezen.
Snap het, maar blijkbaar doe je dit toch met de standaard datatypes van C++ en de standaard operatoren * en / . Vermenigmuldigen met 10 en delen door 256 is anders behoorlijk complex...

Blijkbaar werk je toch met getallen die kleiner zijn dan 256^4 en is de hele toestand niet nodig. C++ kan dat allemaal heel goed zelf.
Als je de losse cijfers in een char* hebt heb je de functie atoi die dat omzet naar een int.
Als je daarna de losse bytes wilt inzien kun je het adres van de int casten naar een byte array (C++ is lang geleden voor mij, maar zoiets moet het zijn):

Code: Selecteer alles

char* num = "1000000";
int inum = atoi(num); //conversie naar int

//na het volgende statement bevat bytes[0] t/m bytes[3] de losse bytes....
uchar* bytes = (uchar *)(&inum);

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Groot getal opsplitsen

Bericht door David » 20 jul 2012, 10:47

Gaat het specifiek om de methode om een groot getal op te splitsen, of met de restricties alleen delen?
Met modulair rekenen

Code: Selecteer alles

#include <iostream>
int main()
{
	int a,n=256,list[3],t=0;
	cout << "Geef een geheel getal > 0" << endl;
	cin >> a;
	
	While !(a==0){
	list[t] = a % 256;
	cout << list[t] << endl;
	t++; //t is teller voor array, die naar volgende element
	a=(a- (a%256) ) / 256; //haal de rest na deling door 256 van a af en deel door 256
	}

return 0;
}
Misschien kan je het aantal elementen uit je array aanpassen aan het getal waar je mee werkt m.b.v. logaritmen. Vervolgens in plaats van een while-, een for-loop.
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 20 jul 2012, 11:12

@David: Nou..
Ik had net een PB gestuurd naar Tsagld, waarin ik het een beetje uitlegde, maar het ging er alleen om om een geheel getal op te splitsen in bytes. Een int bestaat uit 2 bytes en die 2 bytes wou ik graag hebben zodat ik het in een byte array kom plaatsten. Dit zou namelijk een beetje heel lelijk worden:

Code: Selecteer alles

// 5 Bytes voor alleen 13200?? Nee toch?
char array[]  = {1, 3, 2, 0, 0}
Daarom had ik liever de 2 bytes gehad die nodig zijn om het gehele getal te maken:

Code: Selecteer alles

// 51*256^1 + 144*256^0 = 13200
char array[]  = {51, 144}
Nu zal jou code vast ook hetzelfde doen als wat ik nu heb (Ik heb geen idee, kan het niet van je code aflezen :shock:) Maar iig bedankt voor de hulp. Ik heb het project kunnen afronden nu.

Mvg Dyon.

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Groot getal opsplitsen

Bericht door David » 20 jul 2012, 11:21

Ik zal er doorheen lopen voor het getal 13200.

We hebben een array, ( , , , )
a != 0 dus we gaan verder.
Eerst wordt op element 0, (meest "links") 13200 % 256, de rest na deling door 256 ingelezen. Die wordt uitgegeven.
144.
Het array is nu (144, , , )
We gaan een element naar rechts.
Dan halen we van a, de rest af en delen we door 256
a = (13200 - 144)/256
nu, a = 51.
51!=0 dus we doorlopen het weer.
...
Nu heb je het array (144, 51, 0, )
Snap je? Met logaritmen kan je de lengte van de array nauwkeuriger bepalen.
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

Dyon
Nieuw lid
Nieuw lid
Berichten: 8
Lid geworden op: 19 jul 2012, 08:57

Re: Groot getal opsplitsen

Bericht door Dyon » 20 jul 2012, 11:25

Ahzo! Ja nu begrijp ik het wel! Dankjewel ^^

Mvg Dyon.

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Groot getal opsplitsen

Bericht door tsagld » 20 jul 2012, 11:25

Dyon, ik heb je zojuist in een prive bericht uitgelegd dat jouw methode ernstig fout is...
Daarnaast, tenzij je op een hele oude machine werkt, een int is vier bytes.

David, jouw code werkt ook niet voor getallen groter of gelijk aan 256^4, simpelweg omdat dat niet in een int past. Je kunt dan de reken-operatoren niet gebruiken. Dat moet je dus zelf gaan programmeren en dat is lastig, zoals ik eerder zei.

Dyon gebruikt een double. Dat is levensgevaarlijk omdat daar altijd mee afgerond wordt. Een double lijkt geschikt omdat deze getallen tot ongeveer 10^308 aankan, maar een double is nog steeds maar 8 bytes breed hetgeen het bereik beperkt tot ongeveer 10^20 verschillende getallen, inclusief fracties...

David
Moderator
Moderator
Berichten: 4927
Lid geworden op: 14 mei 2009, 16:22

Re: Groot getal opsplitsen

Bericht door David » 20 jul 2012, 15:58

Fijn dat je het begrijpt, Dyon.
Mijn code werkt ook niet voor getallen groter dan 256^4 omdat het array daarvoor tekort is.

Je kan het getal, (als het groter is dan 256^4), inlezen als string. Splitsen in meerdere getallen <= 256^4, elk getal opslaan in array en elk van die getallen converteren naar 256-tallig stelsel.

256^4 = (2^8)^4 = 2^(8*4) = 2^32 heeft ceil(32 * log(2) / log(10)) = 10. Dus 10 cijfers.
Dus splits elk getal in delen van (maximaal) 9 getallen; er bestaan getallen van 10 cijfers > 256^4.

Getal terugvinden? Converteer naar 10-tallig stelsel en plak de getallen aan elkaar.

Stel, het getal is
123456789000456789123.
Dan zou je splitsen in
123456789,
000456789, wordt 456789 en
123.
Let dus op dat je de nodige nullen plaatst.
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)

Plaats reactie