目录
一、互换A, B的值
1. 1使用中间变量
1.2 使用异或^(不允许创建中间变量)
1.3 使用函数(指针传参)
二、 按降序输出A, B的值
2.1 直接实现
2.2 使用指针
三、 找出最大值
3.1 遍历数组
先输入再找(常规)
边输入边找(改进)
其实把数组优化掉也不是不可以(偷懒法,不够通用,第一个常规法最通用)
四、进行排序
4.1 暴力循环法
4.2 冒泡排序
五、逆序存储
六、斐波那契数列
递归实现(最简):
函数实现
七、公约数和公倍数:
7.1 最大公约数
函数实现
递归实现(进阶)
7.2 最小公倍数
八、闰年
九、switch语句
十、求素数
一、互换A, B的值
1. 1使用中间变量
int main() {int A, B;scanf("%d %d", &A, &B);int tmp = A;A = B;B = tmp;printf("%d %d", A, B);return 0;
}
1.2 使用异或^(不允许创建中间变量)
int main()
{int a,b;scanf("%d %d", &a, &b);a = a ^ b;b = a ^ b;a = a ^ b;printf("%d %d", a, b);retu
1.3 使用函数(指针传参)
int Swap(int* m, int* n)
{int tmp;tmp = *n;*n = *m;*m = tmp;return 0;
}int main()
{int a, b;scanf("%d %d", &a, &b);Swap(a, b);printf("%d %d\n", a, b);return 0;
}
二、 按降序输出A, B的值
2.1 直接实现
int main() {int A, B;scanf("%d %d", &A, &B);if (A > B)printf("%d %d", A, B);if (A < B)printf("%d %d", B, A);return 0;
}
2.2 使用指针
int main() {int A, B,*p,*q;scanf("%d %d", &A, &B);p = &A;q = &B;if(*p>*q)printf("%d %d", *p, *q);if (*p < *q)printf("%d %d", *q, *p);return 0;
}
三、 找出最大值
背景:依次输入10个数,找出其中最大的数
3.1 遍历数组
先输入再找(常规)
int main() {int a[10] = { 0 };for (int i = 0; i < 10; i++)//遍历数组输入10个数{scanf("%d", &a[i]);} int max = 0; //遍历数组找出最大值for (int i = 0; i < 10; i++){ if (max < a[i])max = a[i];}printf("%d", max);return 0;
}
边输入边找(改进)
int main() {int a[10] = { 0 }, max = 0;;for (int i = 0; i < 10; i++){scanf("%d", &a[i]);if (max < a[i])max = a[i];}printf("%d", max);return 0;
}
其实把数组优化掉也不是不可以(偷懒法,不够通用,第一个常规法最通用)
int main() {int n,max = 0;;for (int i = 0; i < 10; i++){scanf("%d", &n);if (max < n)max = n;}printf("%d", max);return 0;
}
四、进行排序
背景:依次输入10个数,按降序输出
因为需要存储这10个数,所以这次一定要用数组了(不然创建10个变量不够优雅)
4.1 暴力循环法
不使用排序方法排序数组,强行按降序输出,(循环较为繁琐)
int main() {int a[10] = { 0 };int max = 0;for (int i = 0; i < 10; i++){scanf("%d", &a[i]); //接收10个数if (max < a[i])max = a[i]; //得到最大值,方便后续循环建立}for (int j = max; j >= 0; j--)//从最大值开始向下遍历{for (int i = 0; i < 10; i++)//与数组内的数一一比较{if (j == a[i]) //相等则输出{printf("%d ", j);break; //输出后记得跳出循环,不然可能重复输出}}}return 0;
}
4.2 冒泡排序
冒泡排序是一种简单直观的排序算法,它重复地走访要排序的元素,依次比较相邻的两个元素,如果它们的顺序不正确就交换它们。通过多次遍历数组并比较相邻元素的大小,最大(或最小)的元素会逐渐 “浮” 到最后(或最前)的位置,最终实现整个数组的排序。
具体步骤如下:
- 从第一个元素开始,依次比较相邻的两个元素,如果顺序不正确就交换它们;
- 继续比较下一对相邻元素,执行同样的操作;
- 重复以上步骤,直到没有任何一对相邻元素需要交换位置。
冒泡排序的时间复杂度为O(n^2),其中n表示待排序元素的个数。虽然冒泡排序效率较低,但由于实现简单,适用于元素数量较少的情况。
//冒泡排序
void sort(int a[10]) {for (int i = 0; i < 10; i++) { //遍历数组10次,每次移动一项for (int j = 0; j < 9; j++) //移动一项,每次移动一位,最多共需移动9次if (a[i] < a[i + 1]) //满足条件则交换两项{int tmp = a[i];a[i + 1] = a[i];a[i + 1] = tmp;}}
}int main() {int a[10];for (int i = 0; i < 10; i++) //通过循环接收数组scanf("%d", &a[i]);sort(a); //调用函数进行冒泡排序for (int i = 0; i < 10; i++)printf("%d\n", a[i]); //打印结果return 0;
}
五、逆序存储
背景:用数组接收10个整数,逆序存储,然后输出
int main() {int a[10];for (int i = 0; i < 10; i++) //接收数组scanf("%d", &a[i]);for (int i = 0; i < 5; i++) //逆序存储{int tmp = a[i]; //对称交换5次,通过下标确定交换对象a[i] = a[9 - i];a[9 - i] = tmp;}for (int i = 0; i < 10; i++) //输出结果printf("%d", a[i]);return 0;
}
六、斐波那契数列
递归实现(最简):
递归
int fib(int n) {if (n < 3)return 1;elsereturn fib(n - 1) + fib(n - 2); }
三目表达式
int fib(int n) {return n < 3 ? 1 : fib(n - 1) + fib(n - 2); }
函数实现
//斐波那契数列循环实现 int main() {int f1 = 1, f2 = 1, f3, ;printf("%d\n%d\n", f1,f2);for (int i = 1; i <= 30; i++){f3 = f1 + f2;printf("%d\n", f3);f1 = f2;f2 = f3;}return 0; }
举例是输出1-30项,稍加修改也可以得到某一项
//斐波那契数列循环实现 int main() {int f1 = 1, f2 = 1, f3, n;scanf("%d", &n); //输入想要得到的项for (int i = 1; i <= n; i++){f3 = f1 + f2;f1 = f2;f2 = f3;}printf("%d\n", f2);return 0; }
七、公约数和公倍数:
7.1 最大公约数
函数实现
int gcd(int a, int b){while (b){int t = b;b = a % b;a = t;}return a; }
递归实现(进阶)
三目表达式(最简)
int gcd(int a, int b) {return b > 0 ? gcd(b, a % b) : a; }
7.2 最小公倍数
1. 需调用最大公约数
int lcm(int a, int b) {return a * b / gcd(a, b); }
2. 输出最大公约数和最小公倍数的实例
//输出最大公约数和最小公倍数的实例 int gcd(int a, int b) {return b > 0 ? gcd(b, a % b) : a; } int lcm(int a, int b) {return a * b / gcd(a, b); }int main() {int m, n;scanf("%d %d", &m, &n);int a =gcd(m, n);int b = lcm(m, n);printf("gcd=%d,lcm=%d",a,b);return 0; }
3. 求多个数的最小公倍数
//从定义出发 int main() {int a, b, c;scanf("%d %d %d", &a, &b, &c);for (int i = 1;; i++) {if (i % a == 0 && i % b == 0 && i % c == 0){printf("%d", i);break;}}return 0; }
八、闰年
//输出1900-2000年中是闰年的年份
int main() {for (int i = 1900; i <= 2000; i++)if (i % 4 == 0 && i % 100 != 0 || i % 100 == 0 && i % 400 == 0)printf("%d ", i);return 0;
}
九、switch语句
若题目要求使用switch语句,也要牢记switch语句的用法
switch(表达式) { case 常量1:语句1 case 常量2:语句2 default:语句n break; }
int bonus(int n) {if (n > 1000) //写一个奖金函数,判断奖金属于哪一档return 1;else if (n > 800 && n < 1000)return 2;else if (n > 600 && n < 800)return 3;elsereturn 4;
}int main() { int n;scanf("%d", &n);switch (bonus(n)) //通过switch语句完成{case 1:printf("perfect");break; //使用Switch语句不要忘记加break;case 2:printf("well done");break;case 3:printf("good");break;case 4:printf("keep trying");break;}return 0;
}
十、求素数
求100-200之间的素数
#include<math.h>
#include<stdio.h>
int main()
{int i;int count = 0;for (i = 101; i < 200; i += 2) // 因为偶数一定不是素数,这里缩小范围,在奇数中去找素数{int j; //定义一个变量j用来表示因子int flag = 1;//此时定义一个flag标记,表示假设i是素数for (j = 2; j <= sqrt(i); j++)//假设一个数m= a*b,那么这个数m它的因子a和b中一定至少有一个因子小于等于m的开平方数{if (i % j == 0){flag = 0; break;}}//当上一个for循环任意一个数i都不能被j(2到i-1)整除,也即j==i时,跳出for循环if (flag == 1) //此时判断如果flag还是为1,则说明i是素数{count++;printf("%d ", i);//打印素数}}printf("\ncount = %d\n", count);//所有素数求出来之后,打印素数的个数return 0;
}