1007. 非重复二进制串——略微有点难
单点时限: 2.0 sec
内存限制: 256 MB
对于一个二进制串 b=bkbk-1…b1,如果对任意 i (1≤i≤k-1),满足 bi≠bi+1,那么 b 称为非重复二进制串。给定一个正整数,输出其二进制表示中最长的非重复二进制串的长度。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
第 2~T+1 行,每行一个十进制表示的正整数 n,(0<n<231)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),在接下来一行中输出 n 的二进制表示中最长的非重复二进制串的长度(前置 0 不计算在内)。
样例
input
3 7 10 999output
case #0: 1 case #1: 4 case #2: 2
#include<stdio.h>
#include<string.h>
int reverse(int n)
{
int arr[32] = {0};
int len;
for (int i = 0; i < 32; i++)
{
if (n > 1)
{
arr[i] = n % 2;
n /= 2;
}
else
{
arr[i] = n;
len = i+1;
break;
}
}
int max = 1, tmp = 1;
for (int j = 0; j < len ; j++)
{
if ((arr[j] != arr[j + 1]) && ((j+1)!=len))
{
tmp++;
if (tmp > max)
{
max = tmp;
}
continue;
}
if ((j < len) && (arr[j] == arr[j+1]))
{
tmp = 1;
continue;
}
if (j == len)
break;
}
return max;
}
int main()
{
int n,t;
int max;
int i = 0;
scanf("%d", &t);
for (; t > 0; t--,i++)
{
scanf("%d", &n);
max = reverse(n);
printf("case #%d:\n", i);
printf("%d\n", max);
}
}
1008. 二进制位不同的个数——有上一道题,便显得简单了
单点时限: 2.0 sec
内存限制: 256 MB
对于两个非负整数 x 和 y,函数 ,f(x,y) 定义为 x 和 y 在二进制表示时,其对应位不同的个数。例如,。f(2,3)=1,f(0,3)=2,f(5,10)=4。
现在给出一组非负整数 x 和 y,计算 f(x,y) 的值。
输入格式
第一行:一个整数 ()T(0<T⩽100),表示有 T 组测试数据。
第 2 行 ~ T+1 行:每行输入两个正整数 x 和 y,()(0⩽x,y⩽1000000)。两个整数之间有一个空格。
输出格式
对每组测试数据,输出一行。
样例
input
4 2 3 0 3 5 10 100 200output
1 2 4 4
#include<stdio.h>
#include<string.h>
int reverse(int x, int y)
{
int arr[100] = { 0 };
int str[100] = { 0 };
int num = 0;
int i = 0, j = 0;
for ( j = 0; j < 100; j++)
{
if (x > 1)
{
arr[j] = x % 2;
x /= 2;
}
else
{
arr[j] = x;
break;
}
}
for ( i = 0; i < 100; i++)
{
if (y > 1)
{
str[i] = y % 2;
y /= 2;
}
else
{
str[i] = y;
break;
}
}
int max = 0;
if (j > i)
max = j;
else max = i;
int count = 0;
for (int k = 0; k < max+1; k++)
{
if (arr[k] != str[k])
{
count++;
}
else
continue;
}
return count;
}
int main()
{
int t;
int x, y;
int num = 0;
scanf("%d", &t);
for (; t > 0; t--)
{
scanf("%d%d", &x,&y);
num = reverse(x, y);
printf("%d\n", num);
}
return 0;
}