P1017 进制转换

在这里插入图片描述
在这里插入图片描述

这道题实际上是一道数学题~

首先我们要清楚余数:

15 / 4=3…3

15 / -4=-3…3

-15 / 4= -3…-3

-15/-4=3…-3

开始我也不知道负数除以负数的余数是负数…奇怪的知识增加了~

然后题目说了十进制数 ,第二个是负进制数的基础.

十进制数可正可负 ,但是第二个负进制数一定是负数.

所以我们求以前进制数的时候,余数都是正数对不对,但是这里可能会出现负数.例如上面的:一个负数除以一个正数或者负数的余数都等于负数.但是最后结果不能有负数怎么办呢?很简单,我们只需要让余数-除数,商+1即可.

为什呢?对于上面只有两种情况1(被除数为负,除数为负)2(被除数为正,除数为负):-15 /-4 =3…-3 ,15/-4=-3…3

除数的绝对值一定大于余数的绝对值。针对上面的情况,如果余数为负数,余数减去除数的值一定是正数。

证明:我们设 余数为 r ,除数为 c,商为m

被除数=c*m+r

c*(m+1)+r-c=cm+c+r-c=cm+r=被除数

所以当余数为负时,我们像上面这样处理就好了~其他和求一般的进制方法没啥区别,下面是AC code:

#include <iostream>
#include <vector>
using namespace std;
vector<char > t;
    int main()
    {
        int n,m,a;
        cin>>n>>m;
        a=n;
        char c;
        while(n!=0)
        {
            int r=n%m;
            int k=n/m;
            if(r<0)
            {
                r-=m; //余数减去除数
                n=k+1; //商加上1
            }
            else
            {
                n=k;
            }
            if(r>=10)
            {
               c='A'+r-10;
            }
            else
            {
                c='0'+r;
            }
            t.push_back(c);
        }
        cout<<a<<"=";
        for(vector<char >::iterator it=t.end()-1;it>=t.begin();it--)
        {
            cout<<*it;
        }
        cout<<"(base"<<m<<")";
        return 0;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值