目录
一、互换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; else return 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 最小公倍数
需调用最大公约数
int lcm(int a, int b) { return a * b / gcd(a, b); }
输出最大公约数和最小公倍数的实例
//输出最大公约数和最小公倍数的实例 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; }
八、闰年
//输出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;
else
return 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;
}
标签:10,题目,int,max,C语言,printf,return,main
From: https://blog.csdn.net/qq_42995393/article/details/139281603