目录
1 知识点
(1)CPU在计算的时候,以整形的形式进行相加。c=a+b,无论a,b是什么形式,都按照整形的形式相加,不是整形的要发生整形提升,最后的结果要看c的类型。(知识点在详解操作符)
(2)大端正着放,小端倒着放。
(3)大小端字节序指的是数据在电脑上存储的字节顺序。
2 在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
……
代码展示:
#include <stdio.h>
int main()
{
int arr[10][10] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0)
{
arr[i][j] = 1;
}
if (j == i)
{
arr[i][j] = 1;
}
if (i >= 2 && j >= 1)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
打印结果:
思路:
可以依赖二维数组。
3 利用ascii值 解决问题
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词:A说:不是我。B说:是C。C说:是D。D说:C在胡说 已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。
代码展示:
#include <stdio.h>
int main()
{
char killer = 'a';
for (killer = 'a'; killer <= 'd'; killer++)
{
if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
{
printf("%c", killer);
}
}
return 0;
}
打印结果:c
思路:利用字符在内存中存储的是ascii值,是连续的。
4 猜名次
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一; 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
代码展示:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 0; a <= 5; a++)
{
for (b = 0; b <= 5; b++)
{
for (c = 0; c <= 5; c++)
{
for (d = 0; d <= 5; d++)
{
for (e = 0; e <= 5; e++)
{
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)
{
printf("a= %d b = %d c = %d d = %d e = %d", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
打印结果:a= 3 b = 1 c = 5 d = 2 e = 4
解析:如果 第二个if不加上的话,就会出现多种情况。会出现名次相同的情况。
5 改数字
小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少
输入:123 输出:101; 输入:222222 输出:0
审题:注意修改前是数字,修改后也是数字。
代码展示:
#include <math.h>
#include <stdio.h>
int main()
{
//输入
int a = 0;
scanf("%d", &a);
//计算
int tmp = 0;
int i = 0;
int b = 0;
int sum = 0;
while (a)
{
tmp = a % 10;
if (tmp % 2 == 0)
tmp = 0;
else
tmp = 1;
b = tmp * pow(10, i++);
sum = sum + b;
a = a / 10;
}
//输出
printf("%d", sum);
return 0;
}
思路:每一位的数字 换成相应的数字之后,可以乘以10^n,最低位乘以10^0,然后10^1以此类推。
6 小乐乐走台阶
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?输入包含一个整数n (1 ≤ n ≤ 30) 输出一个整数,即小乐乐可以走的方法数
代码展示:
#include <stdio.h>
int fib(int n)
{
if (n == 1)
{
return 1;
}
else if (n == 2)
{
return 2;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}
思路: 和斐波那契数列类似。
7 小乐乐与序列
老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他 第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n) 输出一行,为去重排序后的序列,每个数后面有一个空格。
输入: 输入
4 5
2 5
2 4
1 3
1 2
输出:1 2 1
输出:1 2 3 4 5
代码展示:
#include <stdio.h>
int main()
{
int arr[100001] = { 0 };//因为还有一个数字k
int i = 0;
int n = 0;
int k = 0;
scanf("%d", &n);//输入
for (i = 0; i < n; i++)
{
scanf("%d", &k);
arr[k] = k;
}
for (i = 0; i < 100001; i++)
{
if (arr[i] != 0)
printf("%d ", arr[i]);
}
return 0;
}
思路:数组,把数字n放到相应的下标n中。既可以去重,又可以排序。
8 小乐乐排电梯
小乐乐学校教学楼的电梯前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。请帮助小乐乐计算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层 输入包含一个整数n (0 ≤ n ≤ 109) 输出一个整数,即小乐乐到达楼上需要的时间
代码展示:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int num = (n / 12) * 4 + 2;
printf("%d", num);
}
理解:当轮到小乐乐的时候,仅仅需要2分钟就行,
9 矩阵转置
KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答 第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素 输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。
输入:
2 3 1 2 3 4 5 6
输出:
1 4 2 5 3 6
代码展示:
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr[n][m];
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n");
}
return 0;
}
数组名不能用变量,c99除了一个新的概念,变长数组。所以是可以的。
如果编译器不允许,可以用以下代码:
#include <stdio.h>
int main()
{
int arr[10][10] = { 0 };
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n");
}
return 0;
}
10 序列中删除指定数字
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。数据范围:序列长度和序列中的值都满足 1≤n≤501 \le n \le 501≤n≤50
第一行输入一个整数(0≤N≤50)。第二行输入N个整数,输入用空格分隔的N个整数。第三行输入想要进行删除的一个整数。
输出为一行,删除指定数字之后的序列
输入:
6 1 2 3 4 5 9 4
输出:
1 2 3 5 9
代码展示:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int del = 0;
scanf("%d", &del);
int j = 0;//存放,并打印的数组
for (i = 0; i < n; i++)
{
if (arr[i] != del)
{
arr[j] = arr[i];
j++;
}
}
for (i = 0; i < j; i++)
{
printf("%d ", arr[i]);
}
return 0;
}