• 全部
  • 问答

负进制数如何计算?(去年我们省奥赛题目)

Chice_wxg 2001-07-28 01:52:47
去年我们这里省里竞赛高中组有个题目是这样的:

大家熟悉2和16进制,现要求写一个程序实现-2和-16进制。

如-15(10进制)==110001(-2进制)

因为
110001=1*(-2)^5+1*(-2)^4+0*(-2)^3+0*(-2)^2+0*(-2)^1+1*(-2)^0


而且举例如下:
30000=11011010101110000 (-2进制)
-2500=7FB8 (-16进制)





大家帮忙想想,应该如何做呢?是不是也有相关的数学公式?
(另:按一般2/16进制数转换的短除法好象不适用了)

还有,别告诉我要用穷举 :)

谢谢!
...全文
174 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
小乖 2001-12-02
不理解
回复
Chice_wxg 2001-07-28
来了来了。

先给您分,等会我再试试 ^_^

回复
one_add_one 2001-07-28
我的程序支持正负进制,快给分了!

就是用的短除法!
回复
林仪明 2001-07-28
gz
回复
one_add_one 2001-07-28
这个程序一定可以得满分!

快给分吧!

/*Tc2.0调试通过*/

#include <stdio.h>
#include <math.h>
main()
{
long n,m,r,result[100];
long *p=result;
printf("Input:");
scanf("%ld %ld",&n,&r);
if (abs(r)>1 && !(n<0 && r>0)){
printf("%ld=",n);
if (n!=0){
while(n!=0){
m=n/r;*p=n-m*r;
if (*p<0 && r<0){
*p=*p+abs(r);m++;
}
p++;n=m;
}
for (m=p-result-1;m>=0;m--){
if (result[m]>9)
printf("%c",55+result[m]);
else
printf("%d",result[m]);
}
}
else printf("0");
printf(" (base %d)\n",r);
}
else printf ("input error!\n");
}
回复
Chice_wxg 2001-07-28
to neusoftlan(擒贼先擒我) 

那么你试试30000的-2进制。

答案不对!
回复
neusoftlan 2001-07-28
谁说短除法不好使?程序我还没有想到怎么编,但我告诉你怎样用短除法实现转化。
比如 -15(10进制)==110001(-2进制)
-15| -2
-----+
8| .....余1 因为-15减8×(-2)=1
-----+
-4| .....余0 因为8 减 (-4) × (-2)=0
-----+
2| .....余0
-----+
-1| .....余0
-----+
1| .....余1
-----+
0| .....余1 结束。

关键就在于使余数为正且小于 x进制 的绝对值。
回复
SoftWare1999 2001-07-28
-2进制除4
-16进制除256

可以找到规律
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2001-07-28 01:52
社区公告
暂无公告