信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换

【题目链接】

ybt 1820:【00NOIP提高组】进制转换
洛谷 P1017 [NOIP2000 提高组] 进制转换
注意:两OJ上题目内容相同,输入输出要求不同

【题目考点】

1. 数制
2. 整除及余数的数学定义

整除及余数相关概念

【解题思路】

在题目描述下,对负数r进制数字n,各位为 d n d n − 1 . . . d 1 d 0 d_nd_{n-1}...d_1d_0 dndn1...d1d0,按位权展开为:
n = d n ∗ r n + d n − 1 ∗ r n − 1 + . . . + d 1 ∗ r 1 + d 0 ∗ r 0 n = d_n*r^n+d_{n-1}*r^{n-1}+...+d_1*r^1+d_0*r^0 n=dnrn+dn1rn1+...+d1r1+d0r0
其中 d 0 , d 1 , . . . , d n d_0,d_1,...,d_n d0,d1,...,dn必须都为正数
除去最后一项,其余项加和一定是r的倍数:
d n ∗ r n + d n − 1 ∗ r n − 1 + . . . + d 1 ∗ r 1 = r ⋅ ( d n ∗ r n − 1 + d n − 1 ∗ r n − 2 + . . . + d 1 ∗ r 0 ) d_n*r^n+d_{n-1}*r^{n-1}+...+d_1*r^1 = r\cdot (d_n*r^{n-1}+d_{n-1}*r^{n-2}+...+d_1*r^0) dnrn+dn1rn1+...+d1r1=r(dnrn1+dn1rn2+...+d1r0),简记为 r ⋅ q r\cdot q rq
n = r ⋅ q + d 0 n = r\cdot q + d_0 n=rq+d0
其中 0 ≤ d 0 < ∣ r ∣ 0\le d_0<|r| 0d0<r
d 0 d_0 d0即为数学中n除以r的余数,即n mod r。
其在C++中的写法为(n%r+abs(r))%r(其原理见:整除及余数相关概念
而后将 n / r n/r n/r的商重新赋值给n: n = ( n − d 0 ) / r n=(n-d_0)/r n=(nd0)/r,再用同样的方法求出下一个数位 d 1 d_1 d1
如此循环,直到n为0。
最后输出记录的各位数字。输出时,注意将10以上的数字转为字母。

【题解代码】

洛谷 P1017 [NOIP2000 提高组] 进制转换
#include<bits/stdc++.h>
using namespace std;
char getCh(int a)
{
	return a < 10 ? a+'0' : a-10+'A';
}
int main()
{
	string s;
    int n, r, a, m;
    cin >> n >> r;//r:基数 
    a = n;
    do//用do...while,即便a为0,也会填充到数组中 
    {
        m = (a%r+abs(r))%r;//求 a mod r 
        s = getCh(m)+s;//将余数接在字符串左边 
        a = (a-m)/r;    
    }while(a != 0);
    cout << n << '=' << s << "(base" << r << ")";
    return 0;
}
ybt 1820:【00NOIP提高组】进制转换

注意处理多组数据,要做状态还原

#include<bits/stdc++.h>
using namespace std;
char getCh(int a)
{
	return a < 10 ? a+'0' : a-10+'A';
}
int main()
{
	string s;
    int n, r, a, m;
    while(cin >> n >> r)//r:基数 
    {
	    a = n;
	    s = "";
	    do//用do...while,即便a为0,也会填充到数组中 
	    {
	        m = (a%r+abs(r))%r;//求 a mod r 
	        s = getCh(m)+s;//将余数接在字符串左边 
	        a = (a-m)/r;    
	    }while(a != 0);
	    cout << s << endl;
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值