[LUOGU1017] 進制轉換

題目描述

我們可以用這樣的方式來表示一個十進制數: 將每個阿拉伯數字乘以一個以該數字所處位置的(值減1)爲指數,以10爲底數的冪之和的形式。例如:123可表示爲 1\times 10^2+2\times 10^1+3\times 10^01×10
2
+2×10
1
+3×10
0
這樣的形式。

與之相似的,對二進制數來說,也可表示成每個二進制數碼乘以一個以該數字所處位置的(值-1)爲指數,以2爲底數的冪之和的形式。一般說來,任何一個正整數R或一個負整數-R都可以被選來作爲一個數制系統的基數。如果是以R或-R爲基數,則需要用到的數碼爲 0,1,….R-1。例如,當R=7時,所需用到的數碼是0,1,2,3,4,5和6,這與其是R或-R無關。如果作爲基數的數絕對值超過10,則爲了表示這些數碼,通常使用英文字母來表示那些大於9的數碼。例如對16進制數來說,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。

在負進制數中是用-R 作爲基數,例如-15(十進制)相當於110001(-2進制),並且它可以被表示爲2的冪級數的和數:

110001=1\times (-2)^5+1\times (-2)^4+0\times (-2)^3+0\times (-2)^2+0\times (-2)^1 +1\times (-2)^0110001=1×(−2)
5
+1×(−2)
4
+0×(−2)
3
+0×(−2)
2
+0×(−2)
1
+1×(−2)
0

設計一個程序,讀入一個十進制數和一個負進制數的基數, 並將此十進制數轉換爲此負進制下的數:-R∈{-2,-3,-4,…,-20}

輸入輸出格式

輸入格式:
輸入的每行有兩個輸入數據。

第一個是十進制數N(-32768<=N<=32767); 第二個是負進制數的基數-R。

輸出格式:
結果顯示在屏幕上,相對於輸入,應輸出此負進制數及其基數,若此基數超過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)
說明

NOIp2000提高組第一題

#include<bits/stdc++.h>
using namespace std;
int r,n;
void solve(int a)
{
    int k;
    k=a%r;
    a=a/r;
    if(k<0)
    {
        k-=r;
        a++;
    }
    if(a!=0) 
        solve(a);
    if(k>9)
        printf("%c",k-10+'A');
    else
        printf("%d",k);
}
int main()
{
    int i,len,h=1;
    cin>>n>>r;
    printf("%d=",n);
    solve(n);  
    printf("(base%d)",r); 
    return 0;    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章