Description
计算机使用的是二进制,和十进制不同的是:二进制运算“逢二进一”。下面举一个二进制加法的运算实例:
11101
+ 110
------------
100011
1所在的位置:
6、2、1
你的任务是:对于任意的两个正的二进制数,求它们和中“1”所在的位置。
Input
有多组测试数据,每组测试数据共两行:
第一行:二进制的加数A,总长度<=200。
第二行:二进制的加数B,总长度<=200。
Output
输出二进制数A+B中“1”所在的位置,位置排序为从左到右:N、N-1、N-2...1,数据之间用空格分隔,行末没有多余的空格。
温馨提醒:
输出小技巧。如何在不确定何时为第一次输出,也不知道何时为最后一次输出时控制末尾的空格,使程序不会在末尾多输出一个空格导致程序错误。下面是一个例子:
int i, hasPrinted;
hasPrinted = 0;
for (i=0; i<n; i++) {
if (xxxxxxxx) { // 这里写输出的判定条件
if (!hasPrinted) {// 如果没有进行过输出
printf(“%d”, n[i]); // 根据你的情况输出,不一定就是%d和n[i]
hasPrinted = 1;
} else {
printf(“ %d”, n[i]);
}
}
}
这样你的输出就不会在末尾多出一个空格了!
Samples
input
111
110
11101
110
output
4 3 1
6 2 1
AC代码
#include <stdio.h>
int main() {
char A[210], B[210], sum[210];
int pos[210];
while (scanf("%s", A)!=EOF) {
scanf("%s", B);
int lenA = strlen(A);
int lenB = strlen(B);
int carry = 0;
int i = lenA - 1;
int j = lenB - 1;
int k = 0;
//计算A+B,从后往前相加
while (i >= 0 || j >= 0 || carry) {
int bitA = (i >= 0) ? A[i] - '0' : 0;
int bitB = (j >= 0) ? B[j] - '0' : 0;
int sumBit = bitA + bitB + carry;
carry = sumBit / 2;
sum[k++] = sumBit % 2 + '0';
i--;
j--;
}
//寻找1的位置
int count = 0;
for (i = k-1; i >= 0; i--) {
if (sum[i] == '1') {
pos[count++] = i + 1;
}
}
//输出
for (i = 0; i < count; i++) {
printf("%d", pos[i]);
if (i != count - 1) {
printf(" ");
}
}
printf("\n");
}
return 0;
}