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

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进制数转换的短除法好象不适用了)

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

谢谢!
...全文
261 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小乖 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

可以找到规律

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧