负权数
来源:互联网 发布:苏亚雷斯2016年数据 编辑:程序博客网 时间:2024/05/16 19:22
当我们写一个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();
}
}
- 负权数
- 1295. 负权数
- Sicily 1295. 负权数
- 1295. 负权数
- WOJ1316-负权数
- Sicily 1295 负权数 (SOJ 1295) 【进制转换】
- SQN在UMTS3G网络的鉴权数据中的使用
- 负分
- 负二进制
- 负能量
- 负能量
- 负能量
- 负能量
- 负负得正 之 ms sql
- 为什么会出现“负库存”、“负毛利”?
- 数学------为什么“负负得正”
- “负暄”的意思
- 周鹤洋中盘负
- 用Session当变量使用
- 新手建站必须知道的知识,菜鸟版!
- 安装Ubuntu3D特效
- 什么是数据库事务
- Ajax-------IE和FIREFOX 脚本的一些区别
- 负权数
- .net
- 浅析QStringr的Unicode存储特性(二)
- .NET内置对象之Response对象
- .NET内置对象之Request对象
- java
- 新的开始~
- .NET内置对象之Application对象
- 用style来实现把过长的字符串替换为省略号