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