1.将一个数二进制位模式从左到右翻转后的值。2.不使用(a+b)/2这种方式,求两个数的平均值。3.一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。4.将一个字符数组返回

1.编写函数:unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:在32位机器上25这个值包含下列各位:
        00000000000000000000000000011001
        翻转后:(2550136832)
        10011000000000000000000000000000
  程序结果返回:2550136832

解题思想:在32位整形数的二进制,用for循环从0-31位依次右移到最后一位然后&1得到这个数字并将这个数字左移进而翻转然后相加得到这个二进制数。

unsigned int reverse_bit(unsigned int value)
{
	int result = 0;
	int i = 0;
	for (; i<32 ; i++)
	{	
		result += (value >>i & 1)<<(31-i);
	}
	return result;
}

2.不使用(a+b)/2这种方式,求两个数的平均值。

解题思想:将a和b都右移一位(相当于/2),然后相加得到结果。

int Average(int a,int b)
{
	int average = (a >> 1) + (b >> 1);
	return average;
}

3.编程实现:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)

解题思想:两个相同的数异或为0,0和任何数异或为任何数。所以将数组中所有的数字都异或可得到。

int Search(int list[],int len)
{
	int num = 0;
	int i = 0;
	for (; i < len; i++)
	{
		num ^= list[i];
	}
	return num;
}

4. 有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:不能使用库函数。
          只能开辟有限个空间(空间个数和字符串的长度无关)。
          student a am i
          i ma a tneduts
          i am a student

解题思想:先翻转每个单词再整体翻转。

void reserve_string(char *l, char *r)
{
	while (l < r)
	{
		char tmp = *l;
		*l = *r;
		*r = tmp;
		l++;
		r--;
	}
}
void reserve(char ch[], int len)
{
	int i = 0;
	char *chl = ch;
	char *chr = ch;
	while (ch[i])
	{
		if (ch[i] == ' ')
		{
			reserve_string(chl, chr - 1);  //先反转每个单词,函数的嵌套调用 tneduts a ma i
			chl = ++chr; //先给chr +1,再把ch的值付给chl
		}
		else
		{
			chr++;
		}
		i++;
	}
	reserve_string(ch, ch + len - 1);  //再整体反转  i am a student
}

主函数代码块:

int main()
{	
	//1.求一个数字的二进制翻转
	unsigned int number = 0;
	printf("请输入要求二进制翻转的数字:");
	scanf("%d", &number);
	int result=reverse_bit(number);
	printf("翻转后为%u\n", result);
	//2.求两个数的平均值。
	int a = 0;
	int b = 0;
	printf("请输入两个数a和b:");
	scanf("%d %d", &a, &b);
	int aver = Average(a, b);
	printf("%d和%d的平均值为:%d\n", a, b, aver);
	//3..求一个数组中只出现一次的数字
	int list[] = { 2,2,3,3,4,4,5,5,6,6,7 };
	int len = sizeof(list) / sizeof(list[1]);
	int search_num = Search(list, len);
	printf("只出现一次的数字为:%d\n", search_num);
	//4.翻转字符串
	char arr[] = "student a am i";
	printf("翻转前:%s\n", arr);
	reserve(arr, strlen(arr));
	printf("翻转后:%s\n", arr);
	system("pause");
	return 0;
}

运行结果截图:

发布了35 篇原创文章 · 获赞 7 · 访问量 3193

猜你喜欢

转载自blog.csdn.net/weixin_44358097/article/details/90671207