1 条题解
-
0
自动搬运
来自洛谷,原作者为

老卡手机
**搬运于
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
- 上传者