题目1:
思路:我们定义两个变量left和right分别为数组的左端下标和右端下标。
左端下标的元素为奇数时,left++继续往前走,为偶数时就停下
右端下标的元素为偶数时,right- -往回走,为奇数时停下
停下后对应的元素交换。
代码实现如下:
#include <stdio.h> void Num_round(int arr[], int sz) { int left = 0; int right = sz - 1; while (left < right) { //1.left指向为奇数,往前走,遇到偶数停下来 while (left < right && arr[left] % 2 != 0) { left++; } //2..right指向为偶数,往后走,遇到奇数停下来 while (left < right && arr[right] % 2 == 0) { right--;; } //3.停下来后两者进行交换 int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; } } int main() { int arr[] = { 1,2,3,4,5,6,7 }; int sz = sizeof(arr) / sizeof(arr[0]); Num_round(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
题目2:
思路:只有当空瓶>1个时,才可以换饮料:
代码实现如下:
#include <stdio.h> int main() { int money = 0; scanf("%d", &money); int empty = money; int total = money; while (empty > 1) { total = total + empty / 2; empty = empty / 2 + empty % 2; } printf("%d\n", total); return 0; }
题目3:
思路:通过观察每一项,我们可知:
代码实现如下:
#include <stdio.h> int main() { int a = 0; scanf("%d", &a); int sum = 0; int tmp = 0; for (int i = 0; i < 5; i++) { tmp = tmp * 10 + a; sum += tmp; } printf("%d\n", sum); return 0; }
题目4:
思路:
这里需要注意的是右移的位数。
#include <stdio.h> void Func(int n) { //偶数位 for (int i = 31; i >= 1; i-=2) { printf("%d ", (n >> i) & 1); } printf("\n"); //奇数位 for (int i = 30; i >= 0; i -= 2) { printf("%d ", (n >> i) & 1); } } int main() { int n = 0; scanf("%d", &n); Func(n); return 0; }