进制转化(尤其是负进制)

现在在noip的系列题上做到过进制转化的问题,一直没时间去搞明白,今天总算弄清楚了。

http://www.cnblogs.com/yylogo/archive/2011/08/04/NOIP-2000-2.html

123可表示为 1*102+2*101+3*10这样的形式。

分四种情况

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值