WOJ-316-负权数
2020-01-18 本文已影响0人
iDucky131
参考了这篇文章洛谷 P1017 进制转换
解题思路主要是:
一个数例如11转化为2进制时是23+21+20,23和2^1都是可以被2整除的,只留下了最后一位不可以被2整除,那么此数取模2的数即为个位(当它可以整除2的时候就是0了嘛),现在我们再来看倒数第二位(倒数第一位刚才就这么出来了),把整个算式不可以整除2的部分减去,再除以2(就是相当于c++中的除以二向下取整,反正把最后一位舍掉了),在用刚才的方法模2又求出了倒数第二位!但是现在我们面临的是负数进制,其实只要细心观察就可以发现,每一位都是正整数,但是%一个负数之后有可能还是负数,所以我们就要让它加上一个进制位变成正数了,于是负数进制的情况也就这样出来了,但是别忘了还要减去这个最后一位(在正数进制的时候不要减去是因为除以的时候自动地向下取整了,但是负数就不一样了),于是就可以接着这样不断地运算下去。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
char a[6]={'A','B','C','D','E','F'};
int number,R;
cin>>number>>R;
while(number!=0||R!=0){
if(number==0)
cout<<0<<endl;
else{
int k;
string result;
while(number!=0){
k=number%R;
if(k<0) k+=abs(R);
number-=k;
number/=R;
if(k>9) result=a[k-10]+result;
else result=to_string(k)+result;
}
cout<<result<<endl;
}
cin>>number>>R;
}
return 0;
}