读书人

请大家伙儿指导一下这道题应该用什么方

发布时间: 2013-06-26 14:29:32 作者: rapoo

请大家指导一下这道题应该用什么方法,想了很久都没头绪,太笨了……
二进制


Time Limit: 1000MS Memory Limit: 65535KB
Submissions: 53 Accepted: 9

Description二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数13,其对应的二进制表示为:1101。因为13=1*2^3+1*2^2+0*2^1+1*2^0.江鸟整天胡思乱想,现在他想到一个问题:如果将平时二进制转换过程中的基数2变成-2,那么转换过来的数将又是什么呢?江鸟将这种转换方式称为“负二进制转换”,为了让大家接受他的理论,他举了个例子如下:
1*(-2)^3+1*(-2)^2+0*(-2)^1+1*(-2)^0=-3,所以-3的该种转换为1101.

Input有多组测试数据。 输入为一个整数M.-100000<=M<=100000

Output输出该种转换得到的结果(输出结果为只有0和1表示的一个串)


Sample Input

-3

Sample Output

1101

不就是1101吗?
[解决办法]
我就先讨论一下正数的情况,首先得到正数的二进制表示,然后从右到左每两位归为一对
有四种情况00,01,10,11
00的负二进制还是00,01的负二进制为11,10的负二进制为10,11的负二进制为01,不过会向前面的二进制对进一位,这时再考虑进位的情况,如果进位不引起再一次的进位的话,步骤还是如前所述。如果进位引起了进位,即11遇上了一个进位,则继续将这个进位传递下去,然后再继续这个步骤。参考二进制加法器。
事实上,我们假设最后得到的负二进制表示为a,而原始的二进制表示为b,
则a&0xcccccccc-a&0x55555555==b//这条是绝对正确的
b&0xcccccccc+b&0x55555555<<1+b&0x55555555=a//这条我没验证,你自己去尝试一下,在没有进位的时候是正确的。
[解决办法]
这个很简单吧!



[解决办法]

#include <stdio.h>

void main()
{
int k = -7;//K为进制,要求K的绝对值大于1小于11,k=-7表示-7进制
int val = 10;
if(0 == val)
{
printf("0");
return;
}

char a[10] = {0};//具体要多少位才能表示-100000<=M<=100000的整数我没具体算,感觉100位总够用了吧
int pos = 0;
while(val)
{
int temp = val%k;
if(temp < 0)
{
a[pos] = temp - k;
}
else
{
a[pos] = temp;


}
val = (val - a[pos])/k;
++pos;
}

while(pos--)
{
printf("%d ", a[pos]);
}
}


稍微改进一下,这个可以算任意进制。

读书人网 >C语言

热点推荐