有一种数制的基数是3,权值可以取-1,0,1,并分别用负号-,0,1表示,如这种数值的101表示十进制的10,既1×32+0×31+1×30=10,又如这种进制的-0表示十进制的-3,既-1×31+0×30=-3。编程要求把给定的有符号整数转换为新进制数,该数的前面不能有多于的0,如10的新数制表示是101,这不要输出成0101
输入输出样例:
Simple input | Output for the input |
1 2 -1 -2 -3 10 -3 12345 -12345 0
| 1 1- - -1 -0 101 -0 1-0-0-11-0 -10101--10
|
解:
分析题目可得-2,-1,0,1,2的新进制数分别为-1,-,0,1,1-。根据规律很容易写出代码。
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string.h>
#include<stdlib.h>
char buf[128];
int len;
int len;
void
main(){
int a;
while(1){
scanf("%d",&a);
if(a==0) break;
len=0;
while(a!=0){
if(a>0)
switch(a%3){
case 0: buf[len++]='0'; a=a/3; break;
case 1: buf[len++]='1'; a=(a-1)/3; break;
case 2: buf[len++]='-'; a=(a+1)/3; break;
}
else
switch(-a%3){
case 0: buf[len++]='0'; a=a/3; break;
case 1: buf[len++]='-'; a=(a+1)/3; break;
case 2: buf[len++]='1'; a=(a-1)/3; break;
}
}
while(--len>=0) putchar(buf[len]);
puts("/0");
}
}
main(){
int a;
while(1){
scanf("%d",&a);
if(a==0) break;
len=0;
while(a!=0){
if(a>0)
switch(a%3){
case 0: buf[len++]='0'; a=a/3; break;
case 1: buf[len++]='1'; a=(a-1)/3; break;
case 2: buf[len++]='-'; a=(a+1)/3; break;
}
else
switch(-a%3){
case 0: buf[len++]='0'; a=a/3; break;
case 1: buf[len++]='-'; a=(a+1)/3; break;
case 2: buf[len++]='1'; a=(a-1)/3; break;
}
}
while(--len>=0) putchar(buf[len]);
puts("/0");
}
}