TEST 8
1.编写函数,这个函数的返回值的二进制位模式从左到右翻转后的值.
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后: (2550136832)
10011000000000000000000000000000
程序返回结果:
2550136832
#include <stdio.h>
#include <stdlib.h>
unsigned int round(unsigned n) {
int i;
unsigned tmp, sum = 0;
for (i = 0; i < 32; ++i, n /= 2) {
tmp = n % 2;
sum = sum * 2 + tmp;
}
return sum;
}
int main() {
printf("%u\n", round(25));
system("pause");
return 0;
}
2.不使用a+b/2,求两个数的平均值.
利用右移求出平均值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
int a = 0;
int b = 0;
printf("请输入大于0的整数a和b: ");
scanf("%d %d", &a, &b);
printf("平均数为: %d\n", (a + b) >> 1);
system("pause");
return 0;
}
3.一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,找出这个数字.
利用异或运算
相同的数异或为0,0与任何数异或位此数.
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[9] = { 1,2,3,4,5,1,2,3,4 };
int i;
int sum = 0;
for (i = 0; i < 9; i++) {
sum ^= a[i];
}
printf("%d\n", sum);
system("pause");
return 0;
}
4.有一个字符数组的内容为"student a am i",
将数组的内容改为"i am a student".
先将每个单词翻转,再将整个句子翻转.
#include <stdio.h>
#include <stdlib.h>
void reverse_string(char* str, int i, int j) {
char tmp;
for (; i < j; i++, j--) {
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void reverse_word(char* str) {
int i;
int start = 0;
int end = 0;
for (i = 0; str[i]; i++) {
if (str[i] == ' ') {
end = i - 1;
reverse_string(str, start, end);
start = i + 1;
}
}
reverse_string(str, start, i - 1);
reverse_string(str, 0, i - 1);
}
int main() {
char str[] = "student a am i";
reverse_word(str);
puts(str);
system("pause");
return 0;
}