ECNU OJ 3031 二进制倒置

给定一个整数 n(0≤n≤10100)、将 n 的 334 位二进制表示形式(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。

例如:n=10,其二进制表示为 (330 个 0)1010,倒置后为 0101,对应输出就是 5。

Input

第 1 行:一个整数 T (1T10) 为问题数。

接下来共 T 行整数,对应每个问题有 1 行,表示 n。

Output

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出结果。

#include <stdio.h>
#include <string.h>
typedef struct  {
    int cnt, v[101];
} BIGINT;

void DIV2(BIGINT *n)
{
    int carry = 0, i; //carry为进位
    if ( n->v[n->cnt -1] < 2) n ->cnt--, carry = 1;  //若最高位为1,
    for (i = n->cnt -1; i>= 0; i--) {				//从第二位开始
        int t = 10 * carry + n->v[i];	//加上上一位余数			
        n->v[i] = t/2; //每一位除以2
        carry = t%2; //余数作为下一位进位
    }
}

void MUL2ADD(BIGINT *n, int d)
{
    int carry=d, i;
    for (i = 0; i < n->cnt; i++){
        int t=carry + n->v[i] * 2; //每一位乘以2,并处理进位
        n->v[i] = t % 10; //若该数超过10,求个位数,否则就是该数本身
        carry = t / 10;	  //余数作为下一位进位
    }
    if (carry > 0) n->v[n->cnt++] = carry; //若循环完之后,carry大于0,进位
    
}

int main(void)
{
char line[102];
int i;
BIGINT n;
scanf("%sx", line);
n.cnt = strlen(line);
for ( i = 0; i < n.cnt; i++ ){
    n.v[i] = line[n.cnt - i - 1] - '0'; //数字倒置
    
}

int s[334], cnt = 0;
while (n.cnt > 0) 
    s[cnt++] = n.v[0] %2; //数字模2
    DIV2(&n);			  //数字除以2
}

for (i = 0; i < cnt; cnt++ ){
    MUL2ADD(&n, s[i]);
}

if (n.cnt == 0) n.cnt++; //若输入为0,做额外处理
for (i = n.cnt-1; i>=0; i--){
    printf("%d".n.v[i];
}
printf('\n');
}

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注