进制转换(洛谷-P1017)
題目描述
我們可以用這樣的方式來表示一個十進制數: 將每個阿拉伯數字乘以一個以該數字所處位置的(值減?1?)為指數,以?10?為底數的冪之和的形式。例如:?123 可表示為?1*10^2+2\*10^1+3*10^0?這樣的形式。
與之相似的,對二進制數來說,也可表示成每個二進制數碼乘以一個以該數字所處位置的(值?-1?)為指數,以?2為底數的冪之和的形式。一般說來,任何一個正整數?RR?或一個負整數??R?都可以被選來作為一個數制系統的基數。如果是以?R?或??R?為基數,則需要用到的數碼為 0,1,....R?1?。例如,當?R=7?時,所需用到的數碼是 0,1,2,3,4,5?和?6?,這與其是?R?或??R?無關。如果作為基數的數絕對值超過?10?,則為了表示這些數碼,通常使用英文字母來表示那些大于?99?的數碼。例如對?1616?進制數來說,用?AA?表示?1010?,用?B?表示?11,用?C?表示?12?,用?D 表示?13?,用?E?表示?14?,用?F?表示?15?。
在負進制數中是用??R?作為基數,例如??15?(十進制)相當于 110001?(??2?進制),并且它可以被表示為?2?的冪級數的和數:
110001=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)
思路:與正數的進制轉換一樣,通過短除即可,要注意的是,如果某個數位出現負數,需要從上一位借一個1來進行運算
源代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<ctime> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 50001 #define MOD 1e9+7 #define E 1e-6 #define LL long long using namespace std; int num,m; void calculate(int n) {int k=n%m;n=n/m;if(k<0){k-=m;n++;}if(n!=0)calculate(n);if(k<10)cout<<k;elsecout<<(char)(k-10+'A'); } int main() {cin>>num>>m;cout<<num<<"=";calculate(num);cout<<"(base"<<m<<")"<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的进制转换(洛谷-P1017)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理论基础 —— 排序 —— 桶排序
- 下一篇: 常用技巧 —— 位运算 —— 异或运算实