以下函数均可通过main的调用实现
(需要实现哪个函数,就取消那个函数所在部分的注释)
int main()
{
/*char arr[] = "student a am i";
int size = sizeof(arr) / sizeof(arr[0]);
change(arr, size - 1, 5);
printf("this changed arr is:\n");
for (int i = 0; i < size; i++)
{
printf("%c", arr[i]);
}
printf("\n");*/
/*int arr[9] = { 2, 3, 4, 5, 2, 3, 4, 5, 1 };
int num = only(arr, 9);
if (-1 != num)
{
printf("this is the only number: %d\n",num);
}
else
{
printf("error!!\n");
}*/
/*float a = 3;
float b = 4;
float av = averge(a, b);
printf("这两个数的平均值为:%f\n", av);*/
/*unsigned int num = 1;
num = reverse_bit(num);
printf("这个数翻转后为:%u\n", num);*/
system("pause");
return 0;
}
1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位从左到右翻转后的值
unsigned int reverse_bit(unsigned int value)
{
unsigned int num = 0;
int arr[32] = { 0 };
int i = 0;
int j = 0;
int index = 0;
int power = 1;
for (i = 0; i < 32; i++)
{
if (value & (1 << (31 - i)))
{
arr[index] = 1;
}
index++;
}//存储该数的二进制
for (i = 0; i < 32; i++)
{
if (arr[i])
{
for (j = 0; j < i; j++)
{
power *= 2;
}
num += power;
power = 1;
}
}//计算翻转后的数
return num;
}
2.不使用(a+b)/2这种方式,求两个数的平均值
float averge(float x, float y)
{
x += (y - x) / 2;
return x;
}
3.编程实现:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的
请找出这个数字(使用位运算)
int only(int* p, int size)
{
int i = 0;
int j = 0;
int k = 0;
int element = 0;
for (i = 0; i < size; i++)
{
if (-1 != p[i])
{
for (j = (i + 1); j < size; j++)
{
for (k = 0; k < 32; k++)
{
//p[i]和p[j]不同
if (((p[i] >> k) & 1) != ((p[j] >> k) & 1))
{
break;
}
}
//p[i]成对,即p[i]和p[j]相同
if (k >= 32)
{
p[j] = -1;//取消排查p[j]
break;
}
}
if (j >= size)
{
return p[i];
}
}
}
return -1;
}
4.有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student"
要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)
char* change(char* p, int size, int word)
{
char* q = p;
char a[10] = { '\0' };
int i = 0;
int j = 0;
int end = size - 1;
start:
for (i = 0; i < size; i++)
{
if (' ' != q[i])
{
a[i] = q[i];
}
else
{
break;
}
}//提出第一个单词
int room = i;
//需要向上移的个数
for (i = 0; i < (end - room); i++)
{
//该元素需要上移的次数
for (j = 0; j < (room + 1); j++)
{
q[(room + 1 + i) - j - 1] = q[(room + 1 + i) - j];
}
}//将后面的数组元素移至原来存放第一个单词的位置
for (; room > 0;)
{
q[end--] = a[--room];
}//让第一个单词去它该去的地方
q[end--] = ' ';
if (word > 2)
{
word--;
goto start;
}
return p;
}