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;
}
上一篇下一篇

猜你喜欢

热点阅读