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