1 条题解

  • 0
    @ 2025-8-24 21:19:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 老卡手机
    **

    搬运于2025-08-24 21:19:58,当前版本为作者最后更新于2018-07-27 21:46:50,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这道题唯一的难点就是

    题目写不清楚

    而且题解也没写清楚

    对负进制不了解

    (于是我百度了回来)

    首先,不管对于什么语言,

    被除数=商*除数+余数,

    这是解决问题的关键

    例如在C++里,-15%-2=-1,-15/-2=7,而7*-2+(-1)=-15

    但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?

    很简单虽然我一开始看不懂

    我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以这样就可以将余数装换为正数

    正确性证明:

    (商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
    

    于是就可以愉快的做题啦

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    
    void zhuan(int n,int r)
    {
    	if(n==0) return ;
    	int m=n%r;//m为余数 
    
    	if(m<0) m-=r,n+=r;//如果余数小于0,转化为正数
    	
    	//将余数转化为ascll码方便输出,省略了一个数组 
    	if(m>=10) m='A'+m-10;
    	else m+='0';
    	
    	zhuan(n/r,r);
    	
    	printf("%c",m);//注意,因为结果为余数倒序,输出要写在递归后面,不然会顺序输出 
    	return ;
    }
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	int n,r;
    	string ans="";
    	cin>>n>>r;
    	cout<<n<<"=";
    	zhuan(n,r);
    	printf("(base%d)",r);
    	return 0;
    }
    
    • 1

    信息

    ID
    19
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者