洛谷题单指南-数学基础问题-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;
}