洛谷題單指南-數學基礎問題-P1017 [NOIP2000 提高組] 進位制轉換

江城伍月發表於2024-04-07

原題連結: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;
}

相關文章