Lige tal

Tags:    c++

Sidder og har fået en opgave hvor jeg bl.a. skal have et inout fra en user der kun må bestå at lige tal fra 2-1000.

Hvis det ikke er et lige tal skal der bedes om et nyt nr igen.....

Hvordan kan dette gøres?

[Redigeret d. 21/04-04 13:38:04 af Kenneth Midtgaard]



Hej
Det kan gøre med %2.
Du siger blot tal%2 og ser på rasten.

Input cin>>
Output cout<<

Med Venlig Hilsen
Janus S. Andersen




Hej
Det kan gøre med %2.
Du siger blot tal%2 og ser på rasten.

Input cin>>
Output cout<<

Med Venlig Hilsen
Janus S. Andersen

modulus (som du bruger) indeholder en division, som er langsom. En hurtigere måde er at se om den mindst betydende bit er sat. Hvis den er det, er tallet ulige:

int tal;
cin >> tal;
if(tal & 0x01 == 1) {
cout << tal << " er ulige." << endl;
} else {
cout << tal << " er lige." << endl;
}



For en god ordens skyld: Det er ikke sikkert at (tal & 1) kan bruges til at checke om et tal er ulige.
Hvordan ved du at % indebærer en division? Kompileren har lov til at oversætte % 2 til hvad den har lyst til (f.ex. en and eller en bitjump).

Husk de to første regeler for optimering:
1: Kompileren er sansynligvis bedre end dig til at optimere.
2: Optimer kun når det er nødvendigt.

En komplet løsning på OP's problem kunne se sådan ud:

Fold kodeboks ind/udKode 




Tak ska i ha :) Nu kan jeg da komme videre..




For en god ordens skyld: Det er ikke sikkert at (tal & 1) kan bruges til at checke om et tal er ulige.

Den vil jeg gerne lige have uddybet lidt. For at et tal kan være ulige SKAL mindst betydende bit være sat og det er det jeg tjekker for med tal&1. Hvordan kan det slå fejl ?


Hvordan ved du at % indebærer en division? Kompileren har lov til at oversætte % 2 til hvad den har lyst til (f.ex. en and eller en bitjump).

Fair nok. Det kan du have ret i.



For en god ordens skyld: Det er ikke sikkert at (tal & 1) kan bruges til at checke om et tal er ulige.

Den vil jeg gerne lige have uddybet lidt. For at et tal kan være ulige SKAL mindst betydende bit være sat og det er det jeg tjekker for med tal&1. Hvordan kan det slå fejl ?


Problemet er tal mindre end 0. For disse er den binære representation ikke defineret. Hvilket vil sige at man ikke kan vide om LSB er sat for et ulige tal eller ikke.

Jeg har stjålet følgende fra et indlæg af Mogens Hansen i dk.edb.programmering.c, fra en længere tråd om emnet:

Konkret eksempel:
Med toers komplement:
000...00010 = +2
000...00001 = +1
000...00000 = 0
111...11111 = -1
111...11110 = -2

Med en's komplement:
000...00010 = +2
000...00001 = +1
000...00000 = +0
111...11111 = -0
111...11110 = -1
111...11101 = -2



t