您的位置:首页 > 其它

NOIP2000 提高组 复赛 进制转换

2017-01-07 20:17 169 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: