考前编程汇总

插入排序

1.0版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main()
{
int arr[] = {10, 2, 8, 7, 1, 5, 4, 3, 9, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
int i, j;
for (i = 1; i < sz; i++) // 次数:元素个数 - 1
{
for (j = i; j > 0; j--)
{
if (arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}

for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}

return 0;
}

2.0版本⭐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main()
{
int arr[] = {10, 2, 8, 7, 1, 5, 4, 3, 9, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
// i和j用来控制循环,temp用来记录要插入的值
int i, j, temp;
for (i = 1; i < sz; i++)
{
j = i - 1;
temp = arr[i];
// 与前面数逐个比较寻找要插入的位置
while (j >= 0 && temp < arr[j])
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}

for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}

return 0;
}

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main()
{
int arr[] = {10, 2, 8, 7, 1, 5, 4, 3, 9, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
int i, j;
for (i = 0; i < sz - 1; i++)
{
int min = i;
for (j = i + 1; j < sz; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (i != min)
{
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}

return 0;
}

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
int arr[] = {10, 2, 8, 7, 1, 5, 4, 3, 9, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
int i, j;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; i < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmep;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}

return 0;
}

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sz = sizeof(arr) / sizeof(arr[0]);
int search_num = 7;
int left = 0;
int right = sz - 1;
while (left <= right) // 注意
{
int mid = (left + right) / 2;
if (arr[mid] > search_num)
{
right = mid - 1;
}
else if (arr[mid] < search_num)
{
left = mid + 1;
}
else
{
printf("index is %d", mid);
break;
}
}

return 0;
}

最大公约数

辗转相除法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
int a = 16;
int b = 12;
int c;
while (c = a % b)
{
a = b;
b = c;
}

printf("%d", b);
return 0;
}

相减法【大减小,直至相等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
int a = 3139;
int b = 1022;
int c;
while (a != b)
{
if (a < b)
{
int temp = a;
a = b;
b = temp;
}
c = a - b;
a = b;
b = c;
}

printf("%d", b);
return 0;
}

斐波那契

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 1 1 2 3 5 8 13 21 34
#include <stdio.h>
int main()
{
long f1, f2;
int i;
f1 = f2 = 1;
for (i = 1; i <= 20; i++)
{
printf("%12ld %12ld", f1, f2);
// 控制输出,每行四个
if (i % 2 == 0)
{
printf("\n");
}
// 前两个月加起来赋值给第三个月
f1 = f1 + f2;
f2 = f1 + f2;
}
return 0;
}

int main()
{
long f1, f2, f;
int i;
f1 = f2 = 1;
printf("%12ld %12ld", f1, f2);
for (i = 3; i <= 40; i++)
{
f = f1 + f2;
f1 = f2;
f2 = f;
printf("%12ld ", f2);
if (i % 4 == 0)
printf("\n");
}
return 0;
}

int main()
{
long f1, f2;
int i;
f1 = f2 = 1;
printf("%12ld %12ld", f1, f2);
for (i = 3; i <= 40; i++)
{
// 前两个月加起来赋值给第三个月f2
f2 = f1 + f2;
// f1作为第二个月
f1 = f2 - f1;
printf("%12ld ", f2);
if (i % 4 == 0)
{
printf("\n");
}
}
return 0;
}



数组法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
int a[40] = {1, 1};
int i;
printf("%12d%12d", a[0], a[1]);
for (i = 2; i < 40; i++)
{
if (i % 4 == 0)
{
printf("\n");
}
a[i] = a[i - 1] + a[i - 2];
printf("%12d", a[i]);
}
return 0;
}

递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int fib(int x);
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", fib(i));
}

return 0;
}
int fib(int x)
{
if (x <= 2)
{
return 1;
}
else
{
return fib(x - 1) + fib(x - 2);
}
}

统计单词个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
char str[100] = "A A A A A ";
// gets(str);
int i = 0;
int word = 0;
int num = 0;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
word = 0;
}
else if (word == 0)
{
num++;
word = 1;
}
i++;
}
printf("%d", num);

return 0;
}

鞍点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#define ROWS 3
#define COLS 3

void findSaddlePoint(int matrix[ROWS][COLS]) {
int i, j, k;
for (i = 0; i < ROWS; i++) {
int row_max = matrix[i][0];
int col_index = 0;
for (j = 1; j < COLS; j++) {
if (matrix[i][j] > row_max) {
row_max = matrix[i][j];
col_index = j;
}
}

int col_min = matrix[0][col_index];
for (k = 0; k < ROWS; k++) {
if (matrix[k][col_index] < col_min) {
col_min = matrix[k][col_index];
}
}

if (row_max == col_min) {
printf("Saddle point found at (%d, %d): %d\n", i, col_index, row_max);
}
}
}

int main() {
int matrix[ROWS][COLS] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

findSaddlePoint(matrix);

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define ROW 5
#define COL 5
int main()
{
int arr[ROW][COL] = {0};
int i, j;
int max, min;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
scanf("%d", &arr[i][j]);
}
}

for (i = 0; i < ROW; i++)
{
max = 0;
for (j = 1; j < COL; j++)
{
if (arr[i][max] < arr[i][j])
{
max = j;
}
}
min = 0;
for (j = 0; j < ROW; j++)
{
if (arr[j][max] < arr[i][min])
{
min = j;
}
}
if (arr[i][max] == arr[max][min])
{
printf("%d", arr[i][max]);
}
}

return 0;
}

三角形面积和周长

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c;
float area,perimeter,s;
scanf("%d %d %d",&a,&b,&c);
s = (a+b+c)/2.0;
area = (sqrt(s*(s-a)*(s-b)*(s-c)));
perimeter = a+b+c;
if (a+b>c && a+c>b && b+c>a)
{
printf("area = %.2f; perimeter = %.2f",area,perimeter);
}
else
printf("These sides do not correspond to a valid triangle");
return 0;
}

image-20240322143419582

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
//在圆内:高度10,不在圆内:高度0;
int r = 1;
printf("请输入任意一点的坐标:");
int a, b;
int x, y;
float c;
scanf("%d %d", &a, &b);
x = fabs(a);
y = fabs(b);//先将a和b的坐标取绝对值
c = sqrt((x - 2) * (x - 2) + (y - 2) * (y - x));//sqrt是求平方根公式,c是求点到圆心的距离为多少,公式为根号下x1-x2的平方+y1-y2的平方
if (c > r)
printf("0");
else
printf("10");//当求出的点到圆心的距离小于等于半径,说明在圆塔上,高度为10
return 0;
}

幻方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define N 3
int fun(int (*a)[N])
{
int i, j, m1, m2, row, colum;
m1 = m2 = 0;
for (i = 0; i < N; i++)
{
j = N - i - 1;
m1 += a[i][i];
m2 += a[i][j];
}
if (m1 != m2) // 判断主对角线和副对角线之和是否相等
return 0;
for (i = 0; i < N; i++)
{
row = colum = 0;
for (j = 0; j < N; j++)
{
row += a[i][j];
colum += a[j][i];
}
if ((row != colum) || (row != m1))
return 0;
}
return 1;
}
int main()
{
int x[N][N], i, j;
printf("Enter number for array:\n");
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &x[i][j]);
printf("Array:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n");
}
if (fun(x))
printf("The Array is a magic square.\n");
else
printf("The Array isn't a magic square.\n");
}

随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL)); // 以时间作为种子
for (int i = 0; i < 10; i++)
{
int randomNumber = rand();
printf("%d ", randomNumber);
}
return 0;
}

负数在左,正数在右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

void paritition(int *arr, int n){
int left = 0;
int right = n - 1;
while(left < right){
while(left < right && arr[left] < 0){
left ++;
}
while(left < right && arr[right] > 0){
right --;
}
if(left < right){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}

int main()
{
int arr[9] = {-5,3,2,-1,4,-3,-4,5,9};
paritition(arr, 9);
for(int i = 0; i < 9; i ++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}

报数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int arr[100] = { 0 };
scanf("%d %d", &m, &n); // m 人数
int quit_num =0, i=1;
for(i=1;i<=m;i++)
arr[i] = i;
i=1;
while(m-quit_num>=n)
{
if(arr[i]!=0)
{
a++
}
if(a%n==0)
{
printf(........);
arr[i] = 0;
quit_num++;
}
i++;
if(i==m)
i=1;
}

哥德巴赫猜想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int main()
{
int num;
void fun(int num);
scanf("%d", &num);
fun(num);
return 0;
}
void fun(int num)
{
int i,j;
int sushu(int num);
void fun(int num);
for(i=2;i<num;i++) // 2也是素数
{
j = num - i;
if(sushu(i)==1&&sushu(j)==1)
{
printf("%d %d", i, j);
return;
}
}
}
int sushu(int num)
{
for(i=2;i<num;i++)
{
if(num%i==0)
{
return 0;
}
}
return 1;
}

汉诺塔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

void hanoi(int n, char a, char b, char c)
{
if (n == 1)
{
printf("%c --> %c\n", a, c); //只有1块的时候,直接从 a 移动到 c
}
else
{
hanoi(n - 1, a, c, b); //将 n - 1 块从 a 移到到 c,借助 b
printf("%c --> %c\n", a, c); //把 a 中剩下的那一块,移动到 c
hanoi(n - 1, b, a, c); //将 n - 1 块从 b 移动到 c,借助 a
}
}

int main()
{
int n;
printf("请输入盘子的个数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');

return 0;
}

球反弹

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
float sn = 100.0, hn = sn / 2;
int n;
for (n = 2; n <= 10; n++)
{
// 第n次落地时共经过的米数
sn = sn + 2 * hn;
// 第n次反跳高度
hn = hn / 2;
}
printf("the total of road is %f\n", sn);
printf("the tenth is %f meter\n", hn);

return 0;
}

猴子吃桃

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

1

a+aa+aaa+aaaa

计算 s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
void main()
{
int i, j, k, sum = 0, n = 1, m, a = 0;
printf("输入累加到几位数:");
scanf("%d", &j);
printf("输入累加数字:");
scanf("%d", &k);
for (i = 1; i <= j; i++)
{
sum = sum + k * n; //  也可以是sum=sum*10+k;
n = n * 10;
a = a + sum;
}
printf("该数为%d\n", a);
}

有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
int n, t, number = 20;
float a = 2, b = 1, s = 0;
for (n = 1; n <= number; n++)
{
s = s + a / b;
t = a;
a = a + b;
b = t;
}
printf("sum is %9.6f\n", s);

return 0;
}

递归

进制转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
//十进制转八进制
int Translate(int n);
int main()
{

int n;
do{ //循环语句所用到的int型的n,必须定义在循环之前。
printf("请输入整数n:");
scanf("%d",&n);
printf("转化为八进制是:");
Translate(n);
printf("\n");
}while(n!=10);

}
int Translate(int n){
int i,j;
if(n==0)
return 0;
else{
i=n%8;//z求余取结果
j=n/8;//求除数,进行下一级的运算
Translate(j);
printf("%d",i);
}
}

数字逆序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
void print(int n)//递归函数,取余
{
if(n==0) return;
else{
printf("%d",n%10);//取余并输出
print(n/10);//递归调用,实现逆序输出
return;
}
}
int main()
{
long n;//题目要求整型就好int也OK
scanf("%d",&n);
print(n);//调用递归函数
return 0;
}

阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int fun(int a)
{
if(a<=1)
return 1;
return(a*fun(a-1));
}
int main()
{
int a,b;
printf("input a num:\n");
scanf("%d",&a);
b=fun(a);
printf("%d!=%d\n",a,b);
return 0;
}

算年龄

有五个人围坐在一起,问第五个人多大了,他说标的四个人大2岁;问四个人多大了,他说比第三个人大2岁,依次类推,前一个人始终比后一个人小2岁,已知第一个人10岁,求第n个人的年龄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int s(int n)
{
int age;
if(n==1)
age=10; //出口
else if(n!=1){
age=s(n-1)+2;//第二个人比前一个人大两岁
}
return age;
}
int main(){
int m;
scanf("%d",&m);
printf("%d",s(m));
return 0;
}

百钱买百鸡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
void main()
{
int x,y,z;
for(x=0; x<=20; x++)
{
for(y=0; y<=33; y++)
{
z=100-x-y;
if(5*x+3*y+z/3==100)
{
printf("公鸡=%d 母鸡=%d 小鸡=%d\n",x,y,z);
}
}
}
}


求一元二次方程的根

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
// 使用开根号 sqrt(d) 函数时,需要添加此头文件
#include <math.h>

int main()
{
float a , b , c, d, x1, x2;
printf("请依次输入三个系数: ");
scanf("%f %f %f", &a,&b,&c);

if(a != 0)
{
d = b * b - 4 * a * c; // 根的判别式
if(d >= 0)
{
x1 = ((-b + sqrt(d)) / (2 * a)); // 求根公式
x2 = ((-b - sqrt(d)) / (2 * a));

printf("x1 = %.2f;x2 = %.2f", x1, x2);
}
else
{
printf("方程无根");
}
}
else
{
printf("输入的第一个值不合法,请重新输入!");
}


return 0;
}

乘法口诀表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
for (int j = 1; j <= 9; j++) {
for (int i = 1; i <= 9; i++) {
printf("%d*%d=%d ", i, j, i * j);
if (i == j) {
break;
}
}
printf("\n");
}
return 0;
}