首页 > 代码库 > 进制转换(负进制) Luogu 1017

进制转换(负进制) Luogu 1017

    最近匆忙刷题,突然发现自己数学废掉了 ,居然忘了进制转换了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