用C语言完成下面题目:题目描述 小明不喜欢二进制下的5,即101。小明可以将一个数二进制里的1改成0,对于一个64位无符号整数,他至少变换多少个1,才能使得其二进制中不出现101这个子串? 比如整数21,其二进制为10101,小明只要把中间的那个1改成0,就不会出现101这个子串了。 输入 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个64位无符号整数。 输出 每行输出一个样例的结果。
时间: 2023-05-18 10:05:31 浏览: 114
思路:
对于一个二进制数,我们可以从高位到低位遍历,如果当前位为1,我们可以将其变为0,但是这样可能会导致后面出现101的情况,因此我们需要考虑后面的情况。如果当前位为1,且下一位也为1,那么我们就需要将下一位变为0,这样才能避免出现101的情况。如果当前位为1,但下一位为0,那么我们就可以将当前位变为0,因为这样不会影响后面的情况。
代码实现:
我们可以定义一个函数,用来计算一个数中1的个数,然后在主函数中调用这个函数,求出最少需要变换的1的个数。
代码如下:
相关问题
c语言:用函数实现将一个十进制数转换为二进制数
下面是一个将十进制数转换为二进制数的函数实现:
```c
#include <stdio.h>
// 十进制转二进制
void decimalToBinary(int n) {
int binaryNum[32];
int i = 0;
while (n > 0) {
binaryNum[i] = n % 2;
n = n / 2;
i++;
}
for (int j = i - 1; j >= 0; j--)
printf("%d", binaryNum[j]);
}
int main() {
int decimalNum;
printf("Enter a decimal number: ");
scanf("%d", &decimalNum);
printf("Binary equivalent: ");
decimalToBinary(decimalNum);
return 0;
}
```
该函数将十进制数转换为二进制数,并将其打印出来。它使用了数组来存储二进制位。首先,我们将十进制数除以2,直到商为0。在每次循环中,我们将余数存储在数组中,并将商作为下一次迭代的输入。最后,我们按相反的顺序打印出数组中的元素,以获取正确的二进制位序列。
用c语言编写一个程序:将一个十进制数正整数d转换为相应的二进制数
下面是用C语言实现将十进制数转换为二进制数的程序:
```c
#include <stdio.h>
int main() {
int d, i, j, bin[32];
printf("请输入一个正整数:");
scanf("%d", &d);
if (d < 0) {
printf("输入的不是正整数!\n");
return 0;
}
i = 0;
while (d > 0) {
bin[i] = d % 2;
d = d / 2;
i++;
}
printf("转换为二进制数为:");
for (j = i - 1; j >= 0; j--) {
printf("%d", bin[j]);
}
printf("\n");
return 0;
}
```
程序的运行结果如下:
```
请输入一个正整数:10
转换为二进制数为:1010
```
程序的实现思路是将输入的十进制数不断除以2,每次取余并将余数存储到一个数组中,直到商为0为止。最后再倒序输出数组中的每一位,就得到了该数的二进制表示。