[NOIP2000 Improvement Group] Basiskonvertierung

[NOIP2000 Improvement Group] Basiskonvertierung

Themenbeschreibung

  Wir können eine Dezimalzahl folgendermaßen darstellen: Multiplizieren Sie jede arabische Zahl mit einer Summe von Potenzen, wobei die Position der Zahl der Exponent und die Basis 10 ist. Beispielsweise kann 123 als 10^2+2*10^1+3*10^0 ausgedrückt werden.

  In ähnlicher Weise kann es bei Binärzahlen auch als Summe jeder Binärzahl multipliziert mit einer Potenz ausgedrückt werden, die die Position der Zahl als Exponent und Basis 2 annimmt.  

  Im Allgemeinen kann jede positive ganze Zahl R oder eine negative ganze Zahl -R als Basis eines Zahlensystems gewählt werden. Wenn die Basiszahl R oder -R ist, sind die zu verwendenden Zahlen 0,1,...R-1.  

Wenn beispielsweise R=7 ist, sind die erforderlichen Zahlen 0, 1, 2, 3, 4, 5, 6, was nichts mit R oder -R zu tun hat. Wenn der Absolutwert der Basiszahl 10 überschreitet, werden zur Darstellung dieser Zahlen normalerweise englische Buchstaben verwendet, um die Zahlen größer als 9 darzustellen. Für eine Hexadezimalzahl verwenden Sie beispielsweise A zur Darstellung von 10, B zur Darstellung von 11, C zur Darstellung von 12 usw.

Bei negativen Basiszahlen wird -R als Basis verwendet, zum Beispiel ist -15 (dezimal) äquivalent zu (110001)_{-2} (-2 Basis) und kann als Summe der Potenzreihen von 2 ausgedrückt werden :

(110001)_{-2}=1* (-2)^5+1* (-2)^4+0* (-2)^3+0*(-2)^2+0*(-2 )^1 +1*(-2)^0

Entwerfen Sie ein Programm, das eine Basis einer Dezimalzahl und einer negativen Basis einliest und die Dezimalzahl in eine Zahl in dieser negativen Basis umwandelt.

Eingabeformat

Jede Eingabezeile verfügt über zwei Eingabedaten.

Die erste ist die Dezimalzahl $n$.
Die zweite ist die Basis $-R$ negativer Basiszahlen.

Ausgabeformat

Geben Sie diese negative Basiszahl und ihre Basis aus. Wenn die Basis 10 $ überschreitet, wird sie wie eine Basis von 16 $ behandelt.

Beispiel 1

Beispieleingabe Nr. 1

30000 -2

Beispielausgabe Nr. 1

30000=11011010101110000(Basis-2)

Beispiel #2

Beispieleingabe Nr. 2

-20000 -2

Beispielausgabe Nr. 2

-20000=1111011000100000(Basis-2)

Beispiel #3

Beispieleingabe Nr. 3

28800 -16

Beispielausgabe Nr. 3

28800=19180(Basis-16)

Beispiel #4

Beispieleingabe Nr. 4

-25000 -16

Beispielausgabe Nr. 4

-25000=7FB8(Basis-16)

Hinweis:

【Datenreichweite】  

Für 100 % der Daten gilt: -20 <= R <= -2, |n| <= 37336.

Die erste Frage der NOIp2000-Verbesserungsgruppe

Ideen:

Wir alle wissen, dass man zunächst von Dezimalzahl in N-Zahlen umwandeln muss :

Teilen Sie diese Zahl fortlaufend durch n, speichern Sie den Rest einzeln und geben Sie ihn schließlich in umgekehrter Reihenfolge aus.

Dann gibt es ein Problem: Sowohl die ursprüngliche Zahl als auch die Basiszahl können negativ sein, was bedeutet, dass der Rest negativ sein kann , sodass wir keine Zahl wie -100-100 ausgeben können.

Wie wandelt man also eine negative Zahl in eine positive Zahl um?

Unser Grundgedanke gliedert sich in zwei Punkte:

  1. Wandeln Sie eine negative Zahl in eine positive Zahl um, die der n-ären Restregel entspricht
  2. Lassen Sie die umgewandelte positive Zahl dem Berechnungsmodus des Rests entsprechen

  1. Wandeln Sie eine negative Zahl in eine positive Zahl um, die der n-ären Restregel entspricht

Lassen Sie uns zunächst das Gesetz der binären Reste diskutieren:

0 1 2 3 4 5 6 7
0 1 0 1 0 1 0 1
Dann lautet die Regel 0101010101...

Dann müssen wir nur noch das Gesetz des Rests der negativen Zahl 010101 ... annehmen, und es wird gelöst.

Wir haben herausgefunden, dass für jede Zahlenmenge die Zahlen in den entsprechenden Intervallen gleich sind . Dann müssen wir nur noch zur Nummer des Intervalls davor springen, da die Länge des Intervalls -m beträgt (m ist die Basis). Dann umwandeln in:

j-=m (j ist die ursprünglich berechnete negative Zahl, m ist die Basiszahl)


  1. Lassen Sie die umgewandelte positive Zahl dem Berechnungsmodus des Rests entsprechen

Es reicht nicht aus, ihn in eine positive Zahl umzuwandeln, da dies der Berechnung des Rests nicht entspricht.

Wie wir alle wissen, sei n der Dividend, m der Divisor und die Basiszahl, a der Quotient und j der Rest. Wir erhalten:

n/m=a

na*m=j

Gemäß dem Algorithmus, den wir gerade abgeleitet haben: j-=m , subtrahieren Sie dann zu diesem Zeitpunkt m von beiden Enden der Gleichung 2 und erhalten Sie

na*mm=jm

Erhöhen Sie den gemeinsamen Faktor, erhalten Sie

n-(a+1)*m=jm

Aber wir müssen jm auch an den Restberechnungsmodus anpassen, dh an die Form von na*m=j anpassen .

Offensichtlich entspricht a=a+1 zu diesem Zeitpunkt gerade der Form na*m=j. So:

n++ (zu diesem Zeitpunkt ist n bereits /=m)

Vollständiger Code:

#include <iostream>
using namespace std;
int n,m;
char a[100001];
int l=0;
int main(){
	int i;
	cin>>n>>m;
	cout<<n<<"=";
	while(n!=0){
		int j=n%m;
		n/=m;//十进制转n进制
		if(j<0)j-=m,n++;//讲解的点
		if(j<10)a[++l]=(char)(j+48);
		else a[++l]=(char)((j-10)+'A');//两种不同的转法
	}
	for(i=l;i>=1;i--)cout<<a[i];//倒序输出
	cout<<"(base"<<m<<")"<<endl;
}

Zusammenfassen:

  Diese Frage basiert tatsächlich auf mathematischen Fähigkeiten und ist nicht schwierig.

Themenlink:

[NOIP2000 Improvement Group] Basiskonvertierung – Luogu https://www.luogu.com.cn/problem/P1017 

Supongo que te gusta

Origin blog.csdn.net/wo_ai_luo_/article/details/130117906
Recomendado
Clasificación