知识点
1. C语言运算符优先级
说明:
同一优先级的运算符,运算次序由结合方向所决定
简单记就是:!
>算术运算符
>关系运算符
>&&
>||
>赋值运算符
2. ASCII值
回车:13
退格:8
3. 进制转换
十进制:11
二进制:0b1011
八进制:013
十六进制:0xb
编程题
1. 冒泡排序
🍑 冒泡排序详解
🍑 测试地址
#include<stdio.h>
int main()
{
int n;
int a[1010];
scanf("%d", &n);
int i,j;
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
//冒泡排序
for(i = 0; i < n-1; i++)//最多需要进行 n-1 轮,每一轮把最大的数放在最后的位置
for(j = 0; j < n-1 - i; j++)
if(a[j] > a[j + 1])//排升序
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
2. 选择排序
🍑 选择排序详解
🍑 测试地址
#include<stdio.h>
int main()
{
int n;
int a[1010];
scanf("%d", &n);
int i,j;
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n - 1; i++)//每次找出一个最小值放在未排序序列的开头
{
int min = i;//记录最小值下标
for(j = i+1; j < n; j++)
if(a[min] > a[j])
min = j;
//交换
int t = a[min];
a[min] = a[i];
a[i] = t;
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
3. 水仙花数
#include<stdio.h>
int main()
{
int i,j;
for(i = 100; i < 1000; i++)
{
int a = i / 100;
int b = i / 10 % 10;
int c = i % 10;
if(i == a*a*a + b*b*b + c* c*c)
printf("%d\n", i);
}
return 0;
}
4. 斐波那契数列
🍑 斐波那契数列
🍑 测试地址
⭐ 此题的数列第一项是 0 ,第二项是 1
#include<stdio.h>
long long f(int x)
{
if(x < 0)
return -1;
if(x == 1)
return 0;
if(x == 2)
return 1;
return f(x - 1) + f(x - 2);
}
int main()
{
int n;
scanf("%d", &n);
long long ans = f(n);
printf("%lld", ans);
return 0;
}
5. 输出菱形
🍑 测试地址
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i, j;
//上半部分
for(i = 0; i <= n ; i++)
{
for(j = 0; j < n - i; j++)//先输出前边的空格
printf(" ");
for(j = 0; j < 2*i + 1; j++)
printf("*");
printf("\n");
}
//下半部分
for(i = 0; i < n; i++)
{
for(j = 0; j <= i; j++)
printf(" ");
for(j = 0; j < 2 *n -1 - i*2; j++)
printf("*");
printf("\n");
}
return 0;
}
6. 素数
⭐ 求素数的n种境界
🍑 素数的判断
🍑 素数个数 [题目]
#include<stdio.h>
#include<stdbool.h>
bool st[50010];
int p[50010];
int idx;
void init()
{
st[0] = 1;
st[1] = 1;
int i = 0;
for(i = 2; i < 50010; i++)
{
if(!st[i])
{
p[idx++] = i;
}
int j = 0;
for(j = 0; p[j] * i <= 50010; j++)
{
st[p[j] * i] = true;
if(i % p[j] == 0)
break;
}
}
}
int main()
{
int n;
scanf("%d", &n);
init();
int i = 0;
long long ans = 0;
for(i = 0; i <= n; i++)
if(!st[i])
ans++;
printf("%lld", ans);
return 0;
}
7. 杨辉三角
🍑 测试地址
#include<stdio.h>
#include<stdbool.h>
int a[20][20];//注意:全局整型数组默认初始化为0
int main()
{
int n;
scanf("%d", &n);
a[1][1] = 1;
int i, j;
for(i = 2; i <= n; i++)
for(j = 1; j <= i; j++)
a[i][j] = a[i - 1][j - 1] + a[i-1][j];
for(i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
8. 99乘法表
🍑 测试地址
#include<stdio.h>
#include<stdbool.h>
int a[20][20];
int main()
{
int i, j,n;
scanf("%d",&n);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
printf("%d*%d=%d ", j, i, i*j);
printf("\n");
}
return 0;
}
8. 最大公约数和最小公倍数
🍑 测试地址
#include <stdio.h>
int gcd(int a,int b);
int main()
{
int n,a,b;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
int g = gcd(a,b);
int lcm = a*b/g;
printf("%d %d\n",g,lcm);
}
return 0;
}
int gcd(int a,int b)
{
return b==0 ? a : gcd(b,a%b);
}
9. 疑难杂题
⭐ 字符统计
输入
ACBDEacbdePOIUJKN1234567bgvyhjg
输出
a is 2
b is 3
c is 2
d is 2
e is 2
g is 2
h is 1
i is 1
j is 2
k is 1
n is 1
o is 1
p is 1
u is 1
v is 1
y is 1
#include<stdio.h>
#include<stdbool.h>
char s[100];
int cnt[27];
int main()
{
int i, j,n,m;
scanf("%s", s);
n = strlen(s);
for(i = 0; i < n; i++)
{
if(s[i] >= 97 && s[i] <= 122)
cnt[s[i] - 'a']++;//统一映射成 0 到 25
if(s[i] >= 65 && s[i] <= 90)
cnt[s[i] - 'A']++;//统一映射成 0 到 25
}
for(i = 0; i < 26; i++)
{
if(cnt[i] != 0)
printf("%c is %d\n", i + 'a', cnt[i]);
}
/* //ASCII码值忘记了……
printf("%d\n", 'a');//97
printf("%d\n", 'z');//122
printf("%d\n", 'A');//65
printf("%d\n", 'Z');//90
*/
return 0;
}
⭐ 字符统计(带空格版)
gets(字符数组):可读取空格,遇到回车即止
#include<stdio.h>
#include<stdbool.h>
char s[10000];
int cnt[27];
int main()
{
int i, j,n,m;
gets(s);
n = strlen(s);
for(i = 0; i < n; i++)
{
if(s[i] >= 97 && s[i] <= 122)
cnt[s[i] - 'a']++;//统一映射成 0 到 25
if(s[i] >= 65 && s[i] <= 90)
cnt[s[i] - 'A']++;//统一映射成 0 到 25
}
for(i = 0; i < 26; i++)
{
if(cnt[i] != 0)
printf("%c:%d\n", i + 'a', cnt[i]);
}
/*
printf("%d\n", 'a');//97
printf("%d\n", 'z');//122
printf("%d\n", 'A');//65
printf("%d\n", 'Z');//90
*/
return 0;
}
输入
that is right
输出
a:1
g:1
h:2
i:2
r:1
s:1
t:3
⭐学生平均成绩
注意输出格式要求
注意整型数据求平均数的精度问题
#include<stdio.h>
#include<stdbool.h>
int main()
{
int i, j,n = 5;
while(n--)
{
int id,ch, ma, en;
scanf("%d %d %d %d", &id, &ch, &ma, &en);
int avg = (ch + ma + en) / 3;//平均成绩
printf("%4d %4d %4d %4d %4d\n", id, ch, ma, en, avg);
}
return 0;
}
输入
1 2 3 4
2 77 88 99
3 8 7 6
4 9 9 9
5 3 7 9
输出
1 2 3 4 3
2 77 88 99 88
3 8 7 6 7
4 9 9 9 9
5 3 7 9 6
⭐ 数组元素查找和计数
#include<stdio.h>
#include<stdbool.h>
int a[110];//数组长度开题目要求的最大范围 +10(保险)
int main()
{
int i, j,n;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
int x;
scanf("%d", &x);
//计数
int max = 0;
int min = 0;
int idx = -1;
for(int i = 0; i < n; i++)
{
if(a[i] == x)//如果数组中有几个元素都== x,取最大的下标(从前往后枚举即可)
idx = i;
if(a[i] > x)
max++;
if(a[i] < x)
min++;
}
printf("%d\n%d\n%d", idx, max, min);
return 0;
}
输入1
10
1 2 3 4 5 6 7 8 9 0
7
输出1
6
2
7
输入2
10
1 2 3 4 5 6 7 8 9 0
-2
输出2
-1
10
0
⭐ 数组元素移动
#include<stdio.h>
#include<stdbool.h>
int a[30];
int main()
{
int i, j,n,m;
scanf("n=%d,m=%d", &n,&m);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < m; i++)
{
int t = a[n - 1];
for(j = n - 1; j > 0; j--)
a[j] = a[j - 1];
a[0] = t;
}
for(i = 0; i < n; i++)
printf("%3d", a[i]);
return 0;
}
输入1
n=7,m=3
1 2 3 4 5 6 7
输出1
5 6 7 1 2 3 4
输入2
n=10,m=5
1 2 3 4 5 6 7 8 9 10
输出2
6 7 8 9 10 1 2 3 4 5
12. 鸡兔同笼
🍑 鸡兔同笼
#include <stdio.h>
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int a,b;//a表示鸡的个数,b表示兔的个数
for(a = 0; a <= n && a*2 <= m; a++)
{
b = n - a;
if(a*2 + b*4 == m)
break;
}
printf("%d %d",a,b);
return 0;
}
11. 汉诺塔
#include<stdio.h>
#include<stdbool.h>
char s[10000];
int cnt[27];
void move(char a, char b)
{
printf("%c->%c\n", a, b);
}
void hanoi(int n, char a, char b, char c)
{
if(n == 1)
move(a, c);
else
{
hanoi(n - 1, a, c, b);
move(a, c);
hanoi(n - 1, b, a, c);
}
}
int main()
{
int n;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}