- Messaggi
- 2,359
- Reazioni
- 1,940
- Punteggio
- 134
- seguendo invece l'idea che ho proposto nei precedenti post:
C++:#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); const int MIN = 38; const int MAX = 55; const int DIM_1 = 12; const int DIM_2 = MAX - MIN + 1; int v[DIM_1]; int u[DIM_2] = {0}; for(int i = 0; i < DIM_1; ++i) { v[i] = rand() % DIM_2 + MIN; u[v[i] - MIN] = 1; cout << v[i] << " "; } cout << endl; for(int i = MIN; i <= MAX; ++i) { if(u[i - MIN] == 0) { cout << i << " "; } } }
A sto punto anche direttamente così, senza il vettore v, che non mi sembra sia tra i requisiti:
C++:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(0));
const int MIN = 38;
const int MAX = 55;
const int DIM_1 = 12;
const int DIM_2 = MAX - MIN + 1;
int u[DIM_2] = {0};
for(int i = 0; i < DIM_1; ++i)
{
int v = rand() % DIM_2 + MIN;
u[v - MIN] = 1;
cout << v << " ";
}
cout << endl;
for(int i = MIN; i <= MAX; ++i)
{
if(!u[i - MIN])
{
cout << i << " " ;
}
}
}
Tralaltro interessante vedere come viene trasformato quel rand() % DIM_2 + MIN pur di non usare la divisione:
Codice:
call rand
mov edi, OFFSET FLAT:std::cout
movsx rsi, eax
cdq
imul rsi, rsi, 954437177
sar rsi, 34
sub esi, edx
lea edx, [rsi+rsi*8]
add edx, edx
sub eax, edx
mov esi, eax
cdqe
add esi, 38
mov DWORD PTR [rsp+rax*4], 1
ottimo, o anche in C
Codice:#include <stdio.h> #include <stdlib.h> #include <time.h> static int v[56]; int main() { int i, c = 0; srand(time(0)); do { i = rand() % 100; if (i < 38 || i > 55) continue; v[i]++; c++; } while (c < 10); for (i = 38; i <= 55; i++) { if (!v[i]) printf("il numero %d non e' nella serie\n", i); } return 0; }
Brutto però quell'if li dentro... farà molti cicli inutili. Non ho capito perchè stai usando 100 anche, tanto i valori sopra al 55 vengono scartati comunque. Mi sono perso qualcosa?