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

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



你可能感兴趣的:(NOIP,提高组,复赛)