1. 程式人生 > >進制轉換(負進制) Luogu 1017

進制轉換(負進制) Luogu 1017

through amp turn cstring 十進制數 log 現在 處理 can

最近匆忙刷題,突然發現自己數學廢掉了 ,居然忘了進制轉換了QAQ~,後來我身邊的王大佬又教了我一遍。

進制轉換多數用的是短除法(別人是這麽叫的),就是除以進制數後,記錄余數,一直除到零為止,然後把記錄的余數倒序輸出,10及以上的用A、B等字母表示。然而如果遇到負進制(******),就應考慮到余數為負數的情況,例如:-3 mod -2 = -1 ,這時,就應該給這個余數加上進制數的絕對值,同時將整除得到的數加上現在的余數,為了保證計算的正確性,因為我們給余數加了進制數,就相當於做除法時 被除數 少減了一個 除數(不妨在這裏我們認為除法就是一連串的減法),例如:如果進制為-2,-3 mod -2 = -1,那 -1 就應該加 2 = 1,同時,-3 mod -2 = 1 就應在 1 上加 1,成為 2,只有這樣 -3 ÷ -2 = 2 ……1 才成立。

說到底,方法還是短除法,只是自己處理一個稍微變形的除法而已。(~A~|||

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 using namespace std;
 8 int n,r,m;
 9 int x;
10 int ji[200000];
11 int main(){
12     scanf("%d %d
",&n,&r); //n 十進制數; r 進制數 13 x=n; 14 while(n!=0){ //短除法 15 m++; 16 ji[m]=n%r; 17 if(ji[m]<0) { //處理余數為負數的情況 18 n=n/r+1; 19 ji[m]+=abs(r); 20 }else 21 n=n/r; 22 } 23 printf("%d",x); //輸出 24 printf("="); 25 for
(int i=m;i>=1;i--){ 26 if(ji[i]<=9) printf("%d",ji[i]); 27 else printf("%c",char(64+ji[i]-9)); 28 } 29 printf("(base"); 30 printf("%d",r); 31 printf(")"); 32 return 0; 33 }

進制轉換(負進制) Luogu 1017