当我们写一个10进制整数时,其值可以用各位的数码乘以10的幂来表示,例如:
123=1×102+2×101+3×100
.
一般来说,对R的进制数N,其绝对值可以用各位的数码乘以R的幂:
N=an×Rn+an-1×Rn-1+…+a0×R0
.
来表示。这里R可以是正数也可以是负数。当R是负数时,我们称之为负权数。不论R是正数还是负数,我们都采用{0,1,…,|R|-1} 这|R|个数码来表示R进制数的个位。如果|R|>10 我们还将使用大写字母来表示编码。例如,对16进制数来说,A表示10,B表示11,……,F表示15。
使用负权数的一个好处是在表示负数时,我们不需要用到负号“-”。举例来说,10进制数-15用-2进制数来表示就是110001:
-15=1×(-2)5+1×(-2)4+0×(-2)3+0×(-2)2+0×(-2)1+1×(-2)0
.
请设计一个程序,读入10进制数和负数R,输出这个10进制数的R进制的形式。
输入输出样例:
|
Simple input |
Output for the input |
|
30000 -2 -20000 -2 28800 -16 -25000 -16
|
11011010101110000 1111011000100000 19180 7FB8 |
解:
对于任意R大于0的数都可以用下面公式将十进制数N转换为R进制:
N=an×Rn+an-1×Rn-1+…+a0×R0
.
当R小于0,N大于0时:
N=an×|R|n+an-1×|R|n-1+…+a0×|R|0
.
设其中的一项为ap×Rp且ap不等于0则:
当p为单数时:ap×Rp=Rp+1+(|R|- ap) Rp,既第p为变为|R|-ap并向高为进1
当p为偶数时:ap×Rp不变
当R小于0,N小于0时:
同理可得:
当p为偶数时:ap×Rp=Rp+1+(|R|- ap) Rp
.
当p为单数时:ap×Rp不变
代码:
#include<string.h>
#include<stdlib.h>
int n,r,ni,ri,p,len,arr[18];
inline void
tor(){ //将十进制数n转换成r进制并保存在数组中arr
int a,b;
a=ni;b=ri;len=0;
memset(arr,0,sizeof(arr)); //将arr清零
while(a>0){
arr[len++]=a%b;
a=a/b;
}
}
inline void
inc(int p){ //向第p位进1
while(++arr[p]>=ri){ //p位溢出向p+1位进1
arr[p]=ri-arr[p];
p++;
}
if(p>=len) len++; //arr长度加1
}
inline void
output(){
for(int p=len-1;p>=0;p--)
if(arr[p]<10)
printf("%d",arr[p]);
else
printf("%c",55+arr[p]); //大于9是从A开始输出
printf(" ");
}
void
main(){
while(1){
scanf("%d%d",&n,&r);
if(n==0 || r==0) return;
ni=abs(n); //ni=|n|
ri=abs(r); //ri=|r|
tor();
p=n>0? 1:0;
for(;p<len;p+=2){
if(arr[p]!=0) {
arr[p]=ri-arr[p];
inc(p+1);
}
}
output();
}
}
1235

被折叠的 条评论
为什么被折叠?



