作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:C语言从入门到进阶
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
文章目录
1. 矩阵转置
2. 上三角矩阵判定
3. 有序序列判断
4. 小乐乐与欧几里得
5. 空心正方形图案
6. 箭形图案
7. 公务员面试
点击免费注册后点击下方标题来刷题吧
1. 矩阵转置
解题思路
在输入矩阵a的时候,同时将对应值赋给转置矩阵b,最后输出即可#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; int m = 0; int i = 0; int j = 0; int arr[10][10] = { 0 }; scanf("%d %d", &n,&m); for (int 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; }
2. 上三角矩阵判定
解题思路
对角线下方元素都为0则是上三角形矩阵,注意循环条件的控制
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; int i = 0; int j = 0; int arr[10][10] = { 0 }; scanf("%d", &n); for (int i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } int flag = 1;//是上三角形矩阵 for (int i = 0; i < n; i++) { for (j = 0; j < i; j++) { if (arr[i][j] != 0) { flag = 0; goto end; } } } end: if (flag == 0) { printf("NO\n"); } else printf("YES\n"); }
每道题都有很多不同的解法,也有很多人分享自己的解题思路,可以讨论,见识到许多不同的思路,这也是我很喜欢牛客的原因之一
3. 有序序列判断
解题思路
当有一个数比下一个数大时,将flag1置为1;当有一个数比下一个数小时,flag2置为1;遍历结束,flag1+flag2>1则说明数组是无序的
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; scanf("%d", &n); int i = 0; int flag1 = 0; int flag2 = 0; int arr[100] = { 0 }; for (i = 0; i < n; i++) { scanf("%d", &arr[i]); if (i > 0) { if (arr[i] > arr[i - 1]) { flag1 = 1; } else if(arr[i]<arr[i-1]) { flag2 = 1; } else { ; } } } if (flag1 + flag2 <= 1) { printf("sorted\n"); } else { printf("unsorted\n"); } return 0; }
牛客还支持各种语言,让你刷题没烦恼,还可以看排行里其他人的解法,总是会有很多解题的思路会让你受益
4. 小乐乐与欧几里得
解题思路
求最大公约数常用的有两种方法,一是九章算术中的更相减损术:大数减小数直到相等,相等的数即最大公约数,该算法时间复杂度约为O(N);二是欧几里得的辗转相除法:大数除以小数取余数(相当于模运算),直到余数为零时(也即模运算为零时)的除数(也即模数)就是最大公约数,该算法时间复杂度约为O(logN)
求最小公倍数的方法:原始数据的乘积除以最大公约数
还要注意根据输入数据的范围确定变量的类型,否则会出现溢出
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> long long f(long long a, long long b) { long long c = 0; long long d = 1; while (d) { c = a / b; d = a % b; a = b; b = d; } return a; } int main() { long long a = 0; long long b = 0; long long ret = 0; long long e = 0; scanf("%lld%lld", &a, &b); if (a > b) { ret=f(a, b); } else { ret=f(b, a); } e = (a * b) / ret; printf("%lld\n", e + ret); return 0; }
还有个强大的功能就是这里有许多大佬面试的经验,可以让我们了解大厂面试是什么样的
5. 空心正方形图案
解题思路
注意循环条件的控制
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; while (scanf("%d",&n) != EOF) { int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if ((i == 0) || (j == 0) || (i == n - 1) || (j == n - 1)) { printf("* "); } else printf(" "); } printf("\n"); } } return 0; }
还有海量求职信息,为你的求职之路保驾护航
6. 箭形图案
解题思路
本题可以将该图案拆分成上下两部分,对于上半部分设置space,star变量记录空格和星号的个数,然后对应自增和自减,然后补全后面的空格公式可以写成2*n+1-space-star
下半部分同理,重置space和star变量,然后对于自增和自减,补全空格输出即可#include <bits/stdc++.h> using namespace std; int main() { int n = 0; //循环读入n while(scanf("%d", &n) != EOF) { //设置space,star值的初始值 int space = 2*n; int star = 1; //外循环开始遍历每一行 for(int i = 0; i < n+1; ++i) { //挨个输出空格的个数 for(int j = 0; j < space; ++j) printf(" "); //挨个输出星号的个数 for(int j = 0; j < star; ++j) printf("*"); //输出剩下的空格 for(int j = 0; j < 2*n+1-space-star; ++j) printf(" "); //更新下一行的空格数和星号个数 space -= 2; star += 1; printf("\n"); } //下半部分的初值设置 space = 2; star = n; //外循环开始遍历每一行,内循环流程和上述一样 for(int i = 0; i < n; ++i) { for(int j = 0; j < space; ++j) printf(" "); for(int j = 0; j < star; ++j) printf("*"); for(int j = 0; j < 2*n+1-space-star; ++j) printf(" "); //更新下一行的空格和星号个数 space += 2; star -= 1; printf("\n"); } } return 0; }
7. 公务员面试
解题思路
输入一个数时,就判定他的大小,并赋值给max,min,且用sum求和,输入数量等于7时,sum减去max,min,求出平均数即可
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; int score = 0; int max = 0; int min = 100; int sum = 0; while (scanf("%d", &score)==1) { n++; if (score > max) max = score; if (score < min) min = score; sum += score; if (n == 7) { printf("%.2lf\n",(sum - max - min) / 5.0); max = 0; min = 100; sum = 0; n = 0; } } return 0; }
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!想要距离大厂更进一步吗?”
点击免费注册和我一起刷题吧
文章出处登录后可见!