124小数点変換の数
別のバンドにバンドの数を達成することができ、プログラムを書きます。
62個の異なる数字{0-9、AZ、AZ}があります。
入力フォーマット
最初のライン入力次の行の数を表す整数。
各行は、次の3桁、第1の2値入力(十進表記)、次いで、バイナリ出力(十進表記)が含まれ、そして最終的に数は数字の間の空間によって分離され、バイナリ入力により表さ入ります。
バイナリ入力とバイナリ出力は、2-62の範囲内にあります。
(10進数)= 10、B = 11 A 、...、Z = 35、= 36、B = 37、...、Z = 61(0-9がまだ0-9を表します)。
出力フォーマット
バイナリ変換のセットごとに、プログラムの出力は、三線で構成される。
最初の行は、第1の入力は16進数(十進表記)、バイナリ入力によって表される、入力数であり、2つの数値を含んでいます。
二行目は、2つの数値が含まれ、第1の出力はバイナリ(十進表記)、入力された2値出力のデジタル表現です。
第三行は空白です。
スペースで区切って同じ行番号の中で。
サンプル入力:
8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030
出力例:
62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890
1.高精度の変換
短い分割秦九韶+
[画像ダンプ外側のリンクに障害が発生し、ソース局は、直接アップロード(IMG-wWd3ZlSg-1583898444912)(下の画像を保存することが推奨され、セキュリティ・チェーン機構を有していてもよい p1.png)]
秦九韶10に変換したバイナリを使用しますシステム、例えば
。
次いで短い小数点除算器10及びB進に変換します。
高精度を必要とします。
2.ショート部門
我々は、短い進数に応じて分割Aの分割を行い、各除算の余りが短いルーチンで保持します。例えば
3 16進数に変換されます。
。
完成コアのコードの10行未満です。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
string sa,sb;
int a,b;
int A[N],B[N];
void solve(){
sb.clear();
int cnt=0,k=0,j=0;
for(auto c : sa){
if(c<='9'&&c>='0') A[cnt++]=c-'0';
if(c<='Z'&&c>='A') A[cnt++]=c-'A'+10;
if(c<='z'&&c>='a') A[cnt++]=c-'a'+36;
}
while(j<cnt){
for(int i=j;i<cnt-1;++i){
A[i+1]+=A[i]%b*a;
A[i]/=b;
}
B[k++]=A[cnt-1]%b;
A[cnt-1]/=b;
if(j<cnt&&A[j]==0) ++j;
}
for(int i=k-1;i>=0;--i){
sb+=(char)(B[k-i-1]<=9?B[k-i-1]+'0':(B[k-i-1]<=35?B[k-i-1]-10+'A':B[k-i-1]-36+'a'));
}
reverse(sb.begin(),sb.end());
j=0;
while(sb[j]=='0'&&j<k-1) ++j;
cout<<a<<" "<<sa<<'\n';
cout<<b<<" ";
for(j;j<k;++j)
cout<<sb[j];
cout<<'\n'<<'\n';
}
int main(){
int T;
cin>>T;
while(T--){
cin>>a>>b;
cin>>sa;
solve();
}
}