logo

Convertire un numero nella rappresentazione a base negativa

Un numero N e una base negativa negBase ci viene dato dobbiamo rappresentare n in quella base negativa. La base negativa funziona in modo simile alla base positiva. Ad esempio in base 2 moltiplichiamo i bit per 1 2 4 8 e così via per ottenere il numero effettivo in decimale. In caso di base -2 dobbiamo moltiplicare i bit con 1 -2 4 -8 e così via per ottenere il numero in decimale. 
Esempi:  
 

stringa Java indice di
Input : n = 13 negBase = -2 Output : 11101 1*(16) + 1*(-8) + 1*(4) + 0*(-2) + 1*(1) = 13


È possibile rappresentare un numero in qualsiasi base negativa con la stessa procedura (Rif Una settimana per i dettagli). Per semplicità (per eliminare i caratteri A B ecc nell'output) stiamo consentendo alla nostra base di essere compresa solo tra -2 e -10. 
 


Possiamo risolvere questo problema in modo simile alla risoluzione del problema con basi positive, ma una cosa importante da ricordare è che il resto sarà sempre positivo sia che lavoriamo con base positiva o base negativa, ma nella maggior parte dei compilatori il risultato della divisione di un numero negativo per un numero negativo viene arrotondato verso 0, di solito lasciando un resto negativo. 
Quindi ogni volta che otteniamo un resto negativo possiamo convertirlo in positivo come di seguito 
 



Let n = (?negBase) * quotient + remainder = (?negBase) * quotient + negBase ? negBase + negBase = (?negBase) * (quotient + 1) + (remainder + negBase). So if after doing 'remainder = n % negBase' and 'n = n/negBase' we get negative remainder we do following. remainder = remainder + (-negBase) n = n + 1   Example :   n = -4 negBase = -3 In C++ we get remainder = n % negBase = -4/-3 = -1 n = n/negBase [Next step for base conversion] = -4/-3 = 1 To avoid negative remainder we do remainder = -1 + (-negBase) = -1 - (-3) = 2 n = n + 1 = 1 + 1 = 2.


Quindi, quando otterremo un resto negativo, lo renderemo positivo aggiungendogli il valore assoluto della base e aggiungendo 1 al nostro quoziente.
L'approccio sopra spiegato è implementato nel codice seguente
 

css del wrapper di testo
C++
// C/C++ program to convert n into negative base form #include    using namespace std; // Utility method to convert integer into string string toString(int n) {  string str;  stringstream ss;  ss << n;  ss >> str;  return str; } // Method to convert n to base negBase string toNegativeBase(int n int negBase) {  // If n is zero then in any base it will be 0 only  if (n == 0)  return '0';  string converted = '';  while (n != 0)  {  // Get remainder by negative base it can be  // negative also  int remainder = n % negBase;  n /= negBase;  // if remainder is negative add abs(base) to  // it and add 1 to n  if (remainder < 0)  {  remainder += (-negBase);  n += 1;  }  // convert remainder to string add into the result  converted = toString(remainder) + converted;  }  return converted; } // Driver code to test above methods int main() {  int n = 13;  int negBase = -2;  cout << toNegativeBase(n negBase);  return 0; } 
Java
// Java program to convert n into  // negative base form class GFG { // Method to convert n to base negBase static String toNegativeBase(int n int negBase) {  // If n is zero then in any base  // it will be 0 only  if (n == 0)  return '0';  String converted = '';  while (n != 0)  {  // Get remainder by negative base   // it can be negative also  int remainder = n % negBase;  n /= negBase;  // if remainder is negative   // add Math.abs(base) to it   // and add 1 to n  if (remainder < 0)  {  remainder += (-negBase);  n += 1;  }  // convert remainder to String add into the result  converted = String.valueOf(remainder) + converted;  }  return converted; } // Driver Code public static void main(String[] args) {  int n = 13;  int negBase = -2;  System.out.print(toNegativeBase(n negBase)); } } // This code is contributed by 29AjayKumar 
Python3
# Python 3 program to convert n into  # negative base form # Method to convert n to base negBase def toNegativeBase(n negBase): # If n is zero then in any base it  # will be 0 only if (n == 0): return '0' converted = '01' while (n != 0): # Get remainder by negative base  # it can be negative also remainder = n % (negBase) n = int(n/negBase) # if remainder is negative add  # abs(base) to it and add 1 to n if (remainder < 0): remainder += ((-1) * negBase) n += 1 # convert remainder to string add # into the result converted = str(remainder) + converted return converted # Driver Code if __name__ == '__main__': n = 13 negBase = -2 print(toNegativeBase(n negBase)) # This code is contributed by # Surendra_Gangwar 
C#
// C# program to convert n into  // negative base form using System; class GFG { // Method to convert n to base negBase static String toNegativeBase(int n int negBase) {  // If n is zero then in any base  // it will be 0 only  if (n == 0)  return '0';  String converted = '';  while (n != 0)  {  // Get remainder by negative base   // it can be negative also  int remainder = n % negBase;  n /= negBase;  // if remainder is negative   // add Math.Abs(base) to it   // and add 1 to n  if (remainder < 0)  {  remainder += (-negBase);  n += 1;  }  // convert remainder to String add into the result  converted = String.Join('' remainder) + converted;  }  return converted; } // Driver Code public static void Main(String[] args) {  int n = 13;  int negBase = -2;  Console.Write(toNegativeBase(n negBase)); } } // This code is contributed by Rajput-Ji 
JavaScript
<script> // JavaScript program to convert n into // negative base form // Method to convert n to base negBase function toNegativeBase(n negBase) {  // If n is zero then in any base  // it will be 0 only  if (n == 0)  return '0';  let converted = '01';  while (n != 0)  {  // Get remainder by negative base  // it can be negative also  let remainder = (-1)*(Math.abs(n) % Math.abs(negBase));  n = parseInt(n/negBase);  // if remainder is negative  // add Math.abs(base) to it  // and add 1 to n  if (remainder < 0)  {  remainder += ((-1)*negBase);  n += 1;  }  // convert remainder to String add into the result  converted = remainder.toString() + converted;  }  return converted; } // Driver Code let n = 13; let negBase = -2; document.write(toNegativeBase(n negBase)'
'
); // This code is contributed by shinjanpatra </script>

Produzione:  
 

11101

Complessità temporale: SU)
Spazio ausiliario: O(1) 
Riferimento : 
https://en.wikipedia.org/wiki/Negative_base
 

Crea quiz