现在在noip的系列题上做到过进制转化的问题,一直没时间去搞明白,今天总算弄清楚了。
http://www.cnblogs.com/yylogo/archive/2011/08/04/NOIP-2000-2.html
123可表示为 1*102+2*101+3*100 这样的形式。
分四种情况
1。十进制数是正数,基数是正数(这种情况最容易)
2。十进制数是正数,基数是负数
3。十进制数是负数,基数是正数(这种情况可以排除,具体请自己思考)
4。十进制数是负数,基数是负数
因此当时考虑问题时,每次操作剩余数必然会存在一个取模的过程。
实际操作也是类似,而且正是这样操作的。
操作1。如果除余的数是负数,那么对除余的数加上基数的绝对值,如果是正数无操作
操作2。每次将带转化的十进制数减去剩余数,再除以基数
代码如下
#include<bits/stdc++.h>
#define MAX 10000
using namespace std;
int ans[1005];
int start;
char str[] = "0123456789ABCDEFGHIJKLNNOPQRSTUVWXYZ";
int main()
{
int i;
int n, base;
int r;
while(scanf("%d%d", &n, &base) == 2){
memset(ans,0,sizeof(ans));
start=0;
printf("%d=", n);
do{
r = n % base;
if(r < 0){//除余的数是负数情况
r -= base;
}
//cout<<r<<endl;
ans[MAX - 1 - start] = r;
start++;
n = (n - r) / base;//每次操作
}while(n != 0);
for(i = start; i > 0; i--){
printf("%c", str[ans[MAX - i]]);
}
printf("\n");
//printf("(base%d)\n", base);
}
return 0;
}