1 编写函数:unsigned int reverse_bit(unsigned int value);这个函数的返回值value的二进制位模式从左到右翻转后的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int value) {
int count = 0 , i = 0;
while (i < 32){
if ((value >> i) & 1){
count |= 1 << (31 - i);
}
i++;
}
return count;
}
int main() {
int a , answer;
printf("请输入需要按二进制位模式从左到右翻转的数:");
scanf("%d", &a);
answer = reverse_bit(a);
printf("翻转后为:%u\n", answer);
system("pause");
return 0;
}
2 不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
float x, y, z;
printf("请输入两个数求平均数(x y):");
scanf("%f %f", &x, &y);
if (x > y) {
z = (x - y) / 2 + y;
}
else {
z = (y - x) / 2 + x;
}
printf("平均数为:%f\n", z);
system("pause");
return 0;
}
3 编程实现:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int main() {
int arr[] = { 1, 2, 3, 2, 1, 3, 4 };
int result = 0 , i;
printf("数组为:");
for (i = 0; i < 5; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
for (i = 0; i < 5; ++i) {
result = result ^ arr[i];
}
printf("其中不成对出现的数为:%d\n", result);
system("pause");
return 0;
}
有一个字符数组的内容为:“student a am i”,请你将数组的内容改为"i am a student".要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
#include<stdio.h>
#include<stdlib.h>
void Reverse_All(char* s) {
char* start = s;
char* end = s;
while (*end != '\0') {
++end;
}
--end;
while (start < end) {
char tmp = *start;
*start = *end;
*end = tmp;
++start;
--end;
}
}
void Reverse_Every(char* s) {
while (*s != '\0') {
char* start = s;
char* end = s;
while (*end != ' ' && *end != '\0') {
++end;
}
--end;
while (start < end) {
char tmp = *start;
*start = *end;
*end = tmp;
++start;
--end;
}
while (*s != ' ' && *s != '\0') {
++s;
}
if (*s != '\0') {
++s;
}
}
}
int main() {
char a[] = "student a am i";
printf("初始的字符串:\n%s\n", a);
Reverse_All(a);
printf("整个字符串按二分法逆置后:\n%s\n", a);
Reverse_Every(a);
printf("以空格为分隔符将每个分隔后的字符串按二分法逆置后:\n%s\n", a);
system("pause");
return 0;
}