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