负权数

来源:互联网 发布:苏亚雷斯2016年数据 编辑:程序博客网 时间:2024/05/16 19:22

当我们写一个10进制整数时,其值可以用各位的数码乘以10的幂来表示,例如:

1231×1022×1013×100

                                                                                                                      .

一般来说,对R的进制数N,其绝对值可以用各位的数码乘以R的幂:

N=an×Rn+an-1×Rn-1+…+a0×R0

                                                                                                                      .

来表示。这里R可以是正数也可以是负数。当R是负数时,我们称之为负权数。不论R是正数还是负数,我们都采用{01|R|-1} |R|个数码来表示R进制数的个位。如果|R|>10 我们还将使用大写字母来表示编码。例如,对16进制数来说,A表示10B表示11,……,F表示15

使用负权数的一个好处是在表示负数时,我们不需要用到负号“-”。举例来说,10进制数-15用-2进制数来表示就是110001

-15=1×(-2)51×(-2)40×(-2)30×(-2)20×(-2)11×(-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小于0N大于0时:

N=an×|R|n+an-1×|R|n-1+…+a0×|R|0

                                                                                                                      .

设其中的一项为ap×Rpap不等于0则:

p数时:ap×RpRp+1+(|R|- ap) Rp,既第p为变为|R|-ap并向高为进1

p为偶数时:ap×Rp不变

 

R小于0N小于0时:

同理可得:

p数时:ap×RpRp+1+(|R|- ap) Rp

                                                                                                                      .

p为单数时:ap×Rp不变

 

代码:

 

 
#include<stdio.h>
#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==0return;
        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();
    }
}
原创粉丝点击