5. 调整数组使奇数全部都位于偶数前面
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
(奇数在数组前面,偶数在数组后面)
实现代码:
//调整数组使奇数全部都位于偶数前面: //输入一个整数数组,实现一个函数, //来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, //所有偶数位于数组的后半部分。 #include <stdio.h> int main() { //思路:设置 left 和 right , //1.left 从左往右 找偶数 //2.right 从右往左 找奇数 //3.left < right:找到就进行调换 int arr[] = { 1,2,3,4,5,6,7,8,9 }; int sz = sizeof(arr) / sizeof(arr[0]); //给出两个下标: int left = 0; //左下标 int right = sz - 1; //右下标 while (left < right)//多次调换 { //1. //从左往右找偶数: while ((left < right) && arr[left] % 2 == 1) { //找到奇数就跳过:left++,但不能跳过right,防止越界 left++; } //2. //从右往左找奇数: while ((left < right) && arr[right] % 2 == 0) { //找到偶数就跳过:right--,但不能跳过left,防止越界 right--; } //3. //到这说明left找到了偶数,right找到了奇数,开始进行调换 if (left < right) { //进行调换: int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; //调换完后跳过这对值: left++; right--; } } int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
测试图片:
6. 打印用 * 组成的X形图案
题目:
多组输入一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
实现代码:
//打印用 * 组成的X形图案: //多组输入一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 #include <stdio.h> int main() { //思路:实际打印的是 n*n 图案 //只不过是当 行等于列(正斜线)、行+列=行数-1(反斜线)打印 * 号 int n = 0;//输出的行数、正斜线、反斜线 的长度 //多组输入: while (scanf("%d", &n) == 1) { int i = 0; //行 int j = 0; //列 for (i = 0; i < n; i++)//循环打印行 { for (j = 0; j < n; j++)//循环打印列 { if (i == j || (i+j == n-1)) //i == j:x图形的正斜线 //i+j == n-1:x图形的反斜线 { printf("*");//打印 * 号 } else { printf(" ");//打印空格 } } //换行 printf("\n"); } } return 0; }
测试图片:
7. 打印用 * 组成的带空格直角三角形图案
题目:
多组输入一个整数(2~20),表示直角三角形直角边的长度,即 * 的数量,也表示输出行数。
实现代码:
//打印用“*”组成的带空格直角三角形图案 //多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。 #include <stdio.h> int main() { int n = 0;//直角三角形直角边的长度、“*”的数量、输出行数 //多组输入: while (scanf("%d", &n) == 1) { int i = 0; //行 int j = 0; //列 for (i = 0; i < n; i++)//循环打印行 { for (j = 0; j < n; j++)//循环打印列 { if (i+j < n-1) //找到规律:行数+列数 的部分 全是空格 { printf(" "); //打印空格,因为要隔一个空格,所以打印两个空格 } else { printf("* "); //打印 * 号,因为要隔一个空格,所以*号后多加一个空格 } } //换行 printf("\n"); } } return 0; }
实现图片:
8. 猜名次
题目:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
实现代码:
//猜名次 #include <stdio.h> int main() { //思路:对用1表示,错用0表示,两个只有一个对 //,那么有 (一个 + 另一个 = 1),只有一个为真,即1,另一个为假,即0 int A = 0; int B = 0; int C = 0; int D = 0; int E = 0; //实现: for (A = 1; A <= 5; A++)//A的所有可能性(5个名次) { for (B = 1; B <= 5; B++)//B的所有可能性(5个名次) { for (C= 1; C <= 5; C++)//C的所有可能性(5个名次) { for (D = 1; D <= 5; D++)//D的所有可能性(5个名次) { for (E = 1; E <= 5; E++)//E的所有可能性(5个名次) { //组合排列了所有情况,把符合所有人说的情况全列出来 if (((B == 2) + (A == 3) == 1) && ((B == 2) + (E == 4) == 1) && ((C == 1) + (D == 2) == 1) && ((C == 5) + (D == 3) == 1) && ((E == 4) + (A == 1) == 1)) { if (A * B * C * D * E == 120)//5个名次各只出现一次 { printf("A=%d B=%d C=%d D=%d E=%d\n", A, B, C, D, E); } } } } } } } return 0; }
实现图片:
9. 猜凶手
题目:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
实现代码:
//猜凶手 #include <stdio.h> int main() { //思路:依次假设每人是凶手进行判断, //看4人说的话是不是1假3真,是则证明假设的该人就是凶手 char killer = 0;//凶手 for (killer = 'a'; killer < 'd'; killer++) //因为 a b c d 的ASCII码值是连着的,所以a+1==b, //以此类推,依次假定每个人是凶手,判断情况 { if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3) //把4句话,4个情况列出来,情况1假3真,真为1,假为0,4种情况“相加”==3,符合就是凶手进行打印 { printf("%c\n", killer); break; } } return 0; }
实现图片:
10. 杨辉三角
题目:
在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
……
实现代码:
//杨辉三角 #include <stdio.h> int main() { //思路:把三角形的前面的空格去掉,变成直角三角形, //再看成对应的长方形,使用二维数组进行遍历 int arr[10][10] = { 0 }; int i = 0; for (i = 0; i < 10; i++)//打印二维数组的行 { int j = 0; for (j = 0; j <= i; j++)//打印二维数组的列 //这里判断条件 j<=i 指:只打印出杨辉三角的那一边 { if (i==j || j==0)//填上杨辉三角两边的1 { arr[i][j] = 1; } //第二行开始要计算中间的值:(注:有第0行) if (i >= 2 && j >= 1) { arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; //找出两个相加的元素 } } } for (i = 0; i < 10; i++) { int j = 0; for (j = 0; j <= i; j++)//只需要打印杨辉三角那边的值 { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
实现图片: