洛谷题单指南-数学基础问题-P1017 [NOIP2000 提高组] 进制转换

原题链接:https://www.luogu.com.cn/problem/P1017

题意解读:负进制数的转换。

解题思路:

下面给出两种思路

1、枚举法

从数据范围来看,

#include <bits/stdc++.h>
using namespace std;

int a[100], cnt = 1;
int n, r;

//将r进制的a[]转换为十进制数
int trans()
{
    int res = 0;
    for(int i = cnt - 1; i >= 0; i--)
    {
        res = res * r + a[i];
    }
    return res;
}

char getchar(int x)
{
    char res = '0';
    if(x >= 0 && x <= 9) res = x + '0';
    if(x >= 10) res = x - 10 + 'A';
    return res;
}

int main()
{
    cin >> n >> r;
    int R = -r; //r是负数,R = abs(r)
    while(n != trans()) //如果r进制数a转换十进制后不等于n
    {
        int d = 1;
        for(int i = 0; i < cnt; i++) //给r进制数a加1
        {
            a[i] += d;
            d = a[i] / R;
            a[i] %= R;
        }
        if(d) a[cnt++] = d;
    }
    cout << n << "=";
    for(int i = cnt - 1; i >= 0; i--) cout << getchar(a[i]);
    cout <<  "(base" << r << ")";
    return 0;
}

2、除留余数法

能不能基于进制转换的标准算法来做呢,

例如:-15转-2进制的过程,理论上应该是这样的:

-15 ➗ -2 = 8 ...... 1

8 ➗ -2 = -4 ...... 0

-4 ➗ -2 = 2 ...... 0

2 ➗ -2 = -1 ...... 0

-1 ➗ -2 = 1 ...... 1

                       1

逆序输出就是110001

但实际上,在C++中,计算结果是这样的

-15 ➗ -2 = 7 ...... -1

8 ➗ -2 = -4 ...... 0

-4 ➗ -2 = 2 ...... 0

2 ➗ -2 = -1 ...... 0

-1 ➗ -2 = 0 ...... -1

可以看到,当负数除以负数时,余数是负数,而我们要求余数必须为正,就可以通过给余数增加|r|来修正

既然余数增加了|r|,对应商就应该加1,通过如此修正就得到了手工计算一样的结果。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n, r;

char getchar(int x)
{
    char res = '0';
    if(x >= 0 && x <= 9) res = x + '0';
    if(x >= 10) res = x - 10 + 'A';
    return res;
}

int main()
{
    cin >> n >> r;
   
    int nn = n, rr; //nn商,rr余数
    vector<int> ans;
    while(nn)
    {
        rr = nn % r;
        nn /= r;
        if(rr < 0) //余数小于0
        {
            rr -= r; //余数加|r|
            nn++; //商加1
        }
        ans.push_back(rr);
    }
    cout << n << "=";
    for(int i = ans.size() - 1; i >= 0; i--) cout << getchar(ans[i]);
    cout <<  "(base" << r << ")";
    return 0;
}

 

posted @ 2024-04-07 15:24  五月江城  阅读(39)  评论(0编辑  收藏  举报