【Luogu p1017]ヘキサ変換

ポータル

フェイス質問

タイトル説明

指標として位置へ、と数字の乗算各桁:我々は、小数点数を表すためにこの方法を使用することができ(10 \)\電源及び塩基価の形態です。例えば、\(123 \)のように表すことができる\(1 \ 10倍^ 2 + 2 \回10 ^ 1 + 3 \回10 ^ 0 \) このような形態。

進数を指標として位置までに数のそれぞれが乗算され同様に、二進数、それが表現することができる(2 \)\塩基形態および電力。

一般に、任意の正の整数\(R&LT \)または負の整数\( - R \)基数システムとして選択することができます。あなたがいる場合には、\(R \)または( - R \)\拠点として、我々はデジタルを使用する必要があります(0、1、... R-1 \)\

場合、例えば、\(R = 7 \) デジタルの必要使用\(0,1,2,3,4,5,6 \) そのある\(R&LT \)または\( - R \ )は何の関係もありません。絶対値がベースの数を超えた場合(\ 10 \)を、次いで、デジタルよりも大きく表現するために、これらの一般的に使用される文字を表すために(\ 9)\ディジタル。例えば、(16 \)\進の使用\(Aは、\)を表し(\ 10)\と、(B \)\表す\(11 \)と、\(C \)を表し\(12 \ )、そして上のようにします。

$ -R&LT進$例えば塩基として負の数である\(--15 \)(10進数)に対応する(110001 \)\(\ ( - 2 \)バイナリ)が、それはのように表すことができる\ (2 \)級数の和:
。\ [= 110001、中国1 \時間(-2)+ 1.5 ^ \時間(-2)+ 0.4 ^ \時間(-2)+ 0.3 ^ \タイムズ( -2)^ 2 + 0 \回 (-2)^ 1 +1 \時間(-2)^ 0 \]

負の数の下にこれを行うには16進数に進数と10進数の負の数、およびこの小数点数を読み込み、プログラムを設計します。

入出力フォーマット

入力形式

各列は、2つの入力、入力データを有しています。
最初は小数点数です\(N- \) 2番目の数字は、負のベースバンドである( - R&LT \)\

出力フォーマット

この出力と負小数点塩基、この場合よりも塩基(\ 10 \)を参照(\ 16 \)六角方法。

サンプル入力と出力

入力サンプル#1

30000 -2

サンプル出力#1

30000=11011010101110000(base-2)

入力サンプル#2

-20000 -2

出力サンプル#2

-20000=1111011000100000(base-2)

入力したサンプル#3

28800 -16

出力サンプル#3

28800=19180(base-16)

入力サンプル#4

-25000 -16

出力サンプル#4

-25000=7FB8(base-16)

説明

[範囲]データについて\(100 \%\)データ、\( - 20 R&ル\ルLT \ -2 \)、\ (| N - | \ 37336ル\)
グループ最初の質問を改善NOIp2000

分析

私たちはすべてのバイナリ変換、短い部門と信じています。Baiduは強く推奨されていません。
この質問は、我々は単に現在の位置が必要であることも非常に明確ですマジックモジュラス、その後再帰次の位置に、までは次のものが存在しません。アイデアは非常に単純ですが、実際には、私は詳細を見つけたとき、剰余負の数が少し異なる場合がありますコーディング。
例えば、でcpp-7 % -2 = 1、、-7 / -2 = 3実際には、これは正しいですが、外に出ているため、我々は、時間のターン進でそれを行うことはできませんマジック弾性率は、その後、負のです......

私たちはあなたがたを行うのですかそれ?   

我々は設定\(A / B = C \ BMOD Dを\) 非常に巧妙な方法がある:\(C \左矢印1個のC + \。)、\ (D \左矢印D - B \)
どのようにそれを証明するのですか?剰余式分割により小学校\(= B \時間C + D \) ああ、セット!
\ [= B \回(
C + 1)+ D - B \\ = B \倍C + B + D - B \\ = B \時間C + D \]を見ることができ、全体の式及び残りの式で除算から逸脱しません。
実際には、これは1による方法があります。
私は本当に学び、ハハ、負のバンドのことを学んだように、この質問はタッチ。

コード

#include <iostream>
#include <cstdio>

int n,r;

void change(int k) {
    if(!k) return ;
    int mod = k % r;
    if(mod < 0) {
        k += r;
        mod -= r;
    }
    if(mod >= 10) mod += 'A' - 10;
    else mod += '0';
    change(k/r);
    printf("%c",mod);
    return ;
}

int main() {
    scanf("%d%d",&n,&r);
    printf("%d=",n);
    change(n);
    printf("(base%d)\n",r);
    return 0;
}

レコードのレビュー

WA 0R31067887(なお、何ら次回は間違いなくあまりにも悲劇に注意を払っていないがあるので、出力フォーマット
AC 100!!!) :R31067892

おすすめ

転載: www.cnblogs.com/crab-in-the-northeast/p/luogu-p1017.html