进制转换(负进制) Luogu 1017
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进制转换(负进制) 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的主要内容,如果未能解决你的问题,请参考以下文章