NOIP2000 提高组 复赛 进制转换

NOIP2000 提高组 复赛 进制转换

1.该题难在弄懂样例,负进制,余数为>=0

2.试了一下,程序自带的/,%发现对负进制转换无用,得自个写一套。

3.弄懂了-15转-2进制,余数>=0,商正负都可以。模拟如下:

-15除-2=8余1

8除-2=-4余0

-4除-2=2余0

2除-2=-1余0

-1除-2=1余1

-15=110001

4.准备写chu,yu两个函数,对照上述模拟,写出了。

5.编码,样例很快通过,提交AC.

耗时:弄懂题意,模拟成功15分钟,编码20分钟

总耗时:35分钟

难度:中等。


附上AC代码,编译环境Dev-C++4.9.9.2

//2000 进制转换
#include <stdio.h>

int chu(int a,int b){//除的结果,a是整数,b是负进制
    int ans;
    int a1,b1;
    b1=b*(-1);
    if(a>0){//大于0
        if(a%b1==0)
            ans=a/b1*(-1);
        else{
            ans=a/b1*(-1);
        }
    }else{//小于0
        a1=a*(-1);
        if(a1%b1==0)
            ans=a1/b1;
        else{
            ans=a1/b1+1;
        }
    }
    return ans;
}
int yu(int a,int b){
    int ans;
    int a1,b1;
    b1=b*(-1);
    if(a>0){//大于0
        ans=a-chu(a,b)*b;
    }else{//小于0
        a1=a*(-1);
        ans=chu(a,b)*b1-a1;        
    }
    return ans;
}
int main(){
    int a,b;
    int a1,b1;
    int stack[100];
    int top;
    int v;
    scanf("%d%d",&a,&b);
    b1=b*(-1);
    top=-1;
    printf("%d=",a);
    while(!(a>0&&a<b1)){
        top++;
        stack[top]=yu(a,b);
        a=chu(a,b);
    }
    top++;
    stack[top]=a;
    while(top>=0){
        v=stack[top--];
        if(v<10)
            printf("%d",v);
        else{
            printf("%c",'A'+v-10);
        }
    }
    printf("(base%d)\n",b);
    return 0;
}



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值