In particolare: ho due interi senza segno (a, b) e voglio calcolare (a * b)% UINT_MAX (UINT_MAX è definito come int max senza segno). Qual è il modo migliore per farlo?Moltiplicazione modulo (in C)
Sfondo: Ho bisogno di scrivere un modulo per linux che emuli una sequenza geometrica, leggendo da esso mi darà l'elemento successivo (modulo UINT_MAX), l'unica soluzione che ho trovato è quella di aggiungere l'elemento corrente a se stesso volte, mentre l'aggiunta avviene utilizzando la seguente logica:. (che uso per la sequenza aritmetica)
for(int i=0; i<b; ++i){
if(UINT_MAX - current_value > difference) {
current_value += difference;
} else {
current_value = difference - (UINT_MAX - current_value);
}
quando Current_Value = a nella prima iterazione (e viene aggiornato ad ogni iterazione, e la differenza = a (sempre) Ovviamente questa non è una soluzione intelligente Come potrebbe raggiungere una persona intelligente?
Grazie!
non è consentito utilizzare l'operatore modulo o i tipi di 8 byte interi? – davogotland
La soluzione stupida molto semplice per cui "long long" è un tipo più lungo di int. long long result = ((long long) a) * ((long long) b)% ((long long) UINT_MAX); Il risultato di –
@JoachimIsaksson non dovrebbe essere necessariamente di tipo molto lungo, giusto? – davogotland