给定一个整数 n(0≤n≤10100)、将 n 的 334 位二进制表示形式(不包括开头可能的值为 0 的位,n=0 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。
例如:n=10,其二进制表示为 (330 个 0)1010,倒置后为 0101,对应输出就是 5。
Input
第 1 行:一个整数 T (1≤T≤10) 为问题数。
接下来共 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'); }