洛谷 P1017 进制转换(负进制)

洛谷 P1017 进制转换(负进制)

思路:

首先,不管对于什么语言来说,被除数=商*除数+余数,这是解决问题的关键
例如,在c语言中:(-7)%(-3)= (-1) (-7)/(-3)= 2
而(-7)(被除数)= 2 (商)*(-3)(除数) +(-1)(余数)
但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?
我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以余数-除数一定大于0,我们把余数-除数的值作为余数
正确性证明:
(商+1)* 除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
typedef long long ll;
using namespace std;

int n,r;

void change(int n,int r){//n为被除数,r为除数
    if(n==0) return;
    int m=n%r;
    if(m<0){//如果余数小于0,则余数=余数-除数
        m-=r;
        n+=r;//被除数增加r是为了让商+1
    }
    //将余数转化为ASCLL码输出
    if(m>=10){
        m='A'+m-10;
    }else{
            m=m+'0';
    }
    change(n/r,r);//
    printf("%c",m);
}

int main(){
    scanf("%d%d",&n,&r);
    printf("%d=",n);
    change(n,r);//变换进制
    printf("(base%d)",r);
    return 0;
}
发布了253 篇原创文章 · 获赞 15 · 访问量 7986

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/103910182