😁本文作者:大家好,我是原始豌豆,欢迎来到牛客网刷题解析第七期,感谢你阅读本文欢迎评论,收藏,点赞哦。
😂内容专栏:这里是《牛客网在线编程》专栏,笔者用重金(时间和精力)打造,每道题目提供多种解法,从基础到拓展,希望可以帮到读者们。
😘写作不易:本文对每道题目提供了多种解法并加上了详细的注释,意在帮助读者锻炼思维灵活性,提高分析、解决问题的能力💓)。
开端
在这篇文章中,我将分享刷题过程中的一些感悟、技巧和策略。我会详细解析173道语法题,通过实例来展示如何理解和运用C语言的语法规则。同时,我也会分享一些个人的学习心得和经验,希望能帮助到同样热爱编程的你。
挑战自己的极限,收获编程的乐趣,让我们一起踏上这段奇妙的C语言刷题之旅吧!!!!
题目目录
牛客网语法篇基础语法116-140题(C语言实现)
题目网址链接请点这✌️
标注*符号的题目为重点题目
本页目录跳转请点下方
🍕BC116 [NOIP2013]记数问题*
🍔BC117 逆序输出
🍟BC118 N个数之和
🌭BC119 最高分与最低分之差
🍿BC120 争夺前五名
🧂BC121 有序序列合并
🥓BC122 有序序列判断
🥓BC123 有序序列插入一个整数
🥓BC124 序列中删除指定数字*
🥓BC125 序列中整数去重
🥓BC127筛选求素数法
🥓BC133 回型矩阵 *
🥓BC134 蛇型矩阵*
🥓BC136 判断上三角矩阵*
🥓BC139 矩阵交换
🥓BC140 杨辉三角
题目
🍕BC116 [NOIP2013]记数问题
解法一
先利用循环产生1~n个数字,再把每个数字不断循环取余数,每个余数都和输入的X匹配,相同则计数器+1,不同继续循环到当前数字为0为止。
#include <stdio.h>
int main() {
int n, x;//定义两个整数变量n和x,以及。
int count = 0;//计数器变量count和临时变量tmp
int tmp = 0;
scanf("%d %d", &n, &x);
for (int i = 1; i <= n; i++) {//使用一个外部的for循环,循环变量为i,从1迭代到n。
for ( tmp = i; tmp != 0; tmp /= 10) {//在外部循环的每一次迭代中,使用一个内部的for循环,循环变量为tmp,初始值为当前的i。这个内部循环会一直执行,直到tmp变为0。
if (tmp % 10 == x)//在内部循环中,如果tmp除以10的余数等于x,则将计数器count增加1。
count++;
}
}
printf("%d", count);
return 0;
}
🍔BC117 逆序输出
解法一
利用数组储存输入的数字,再逆序打印数组
#include <stdio.h>
int main() {
int n=0;int arr[10]={0};//数组初始化
for(int i=0;i<10;i++)
{
scanf("%d",&n);
arr[i]=n;//把每个元素存到数组里
}
for(int i=9;i>=0;i--)
{
printf("%d ",arr[i]);//把数组每个元素倒序打印
}
return 0;
}
🍟BC118 N个数之和
解法一
创建变长数组储存输入的数字,再累加数组每个元素的值
#include <stdio.h>
int main() {
int n=0,sum=0;
scanf("%d",&n);
int arr[n];//变长数组不能初始化
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);//循环存入数字
sum+=arr[i];//累加
}
printf("%d",sum);
return 0;
}
解法一
输入几个整数就循环几次,每次拿一个变量接收,然后sum+=这个变量
#include<stdio.h>
int main() {
int n,num;
int sum = 0;//sum初始化为0
scanf("%d", &n);
while (n--) { //n为0时循环结束
scanf("%d", &num);
sum += num;//累加
}
printf("%d", sum);
}
🌭BC119 最高分与最低分之差
解法一
利用变长数组存储每一个数,与最大值最小值进行比较,不断更新最大最小值,最后打印最大值与最小值的差。
#include <stdio.h>
int main() {
int n = 0;
int sum = 0;
int lower = 100, higher =0.00; // 定义两个变量lower和higher,用于存储数据中的最小值和最大值,初始值分别为100和0
scanf("%d", &n);// 从标准输入读取一个整数n,表示数组的长度
int arr[n];//变长数组不能初始化,C99标准以后支持变长数组
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);//输入n个数据,存入数组,存放时每个数据都跟最大最小值比较一下
if (arr[i] <lower)// 如果读取的数据小于当前最小值,则更新最小值
lower = arr[i];
if (arr[i] >higher)//如果读取的数据大于当前最大值,则更新最大值
higher = arr[i];
sum += arr[i];
}
printf("%d", higher-lower);// 输出最大值-最小值的差
return 0;
}
解法二
通过循环每次比较输入的数值和最大最小值的大小,然后更新最大或最小值
//因为有输入缓冲区,所以数据不用存放在数组里
#include <stdio.h>
int main() {
int n = 0;
int sum = 0.0;
int score = 0.0;
int lower = 100.0,higher = 0.0;// 定义变量lower和higher,用于存储数据中的最小值和最大值,初始值分别为100和0
scanf("%d", &n);// 从标准输入读取一个整数n,表示数据的数量
for (int i = 0; i < n; i++) {
scanf("%d", &score);//输入五个数据,是存在输入缓冲区中的,所以可以不用数组
if (score < lower)// 如果读取的数据小于当前最小值,则更新最小值
lower = score;
if (score > higher)//如果读取的数据大于当前最大值,则更新最大值
higher = score;
sum += score;
}
printf("%d", higher-lower);// 输出最大值、最小值和平均值,保留两位小数
return 0;
}
🍿BC120 争夺前五名
解法一
利用冒泡排序
#include <stdio.h>
int main() {
int n = 0;
int tmp = 0;
scanf("%d", &n);// 从标准输入读取一个整数n,表示数组的长度
int arr[n];//变长数组不能初始化,C99标准以后支持变长数组
for (int i = 0; i < n; i++) {
scanf("%d",&arr[i]);
}
for (int i = 0; i < n - 1; i++) {//程序使用嵌套的循环实现冒泡排序。外层循环控制排序的轮数,内层循环控制每轮排序中相邻元素的比较和可能的交换。
for (int j = 0; i < n - i - 1; j++) {
if (arr[j + 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (int i = 0; i < 5; i++)//冒泡排序后,数组前五个元素就是最大元素
printf("%d ", arr[i]);
return 0;
}
解法一
每次挑出最大的数然后置为0即可。
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
//申请存放数组并输入初始化
int a[40] = {0};
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int m = 0, index = 0;
//外循环进行五次筛选,每次筛选出当前最大的数值
for(int i = 0; i < 5; ++i) {
//内循环遍历数组中的数值,如果碰到比当前数更大的值则保存起来
for(int j = 0; j < n; ++j) {
if(a[j] > m) {
m = a[j];
index = j;
}
}
//对最大数置零,防止多次输出,然后输出当前最大值
a[index] = 0;
printf("%d ", m);
m = 0;
}
return 0;
}
🧂BC121 有序序列合并
解法一
**
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d\n", &n, &m);
int i, j,arr[2000];
int tmp;
for(i=0; i<n; i++)
{
scanf("%d ", &arr[i]);
}
for(i=n; i<n+m; i++)
{
scanf("%d ", &arr[i]);
}
for(i=0; i<n+m; i++)
{
for(j=0; j<n+m-i-1; j++)
{
if(arr[j] > arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(i=0; i<n+m; i++)
{
printf("%d ", arr[i]);
}
}
🥓BC122 有序序列判断
解法一
将前一个数和后一个数做差,根据大于小于的情况进行计数,如果计数的情况为n-1,那么就说明此序列两两相减的趋势相同,所以可对其进行是否有序的判断
int main()
{
int i,arr[100],n,cnt1=0,cnt2=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<n-1;i++)
{
if(arr[i]-arr[i+1]>=0)
cnt1++;//降序计数
else if(arr[i]-arr[i+1]<=0)
cnt2++;//升序计数
}
if(cnt1==n-1||cnt2==n-1)//一共n个数,两两相减的到n-1个结果
printf("sorted");
else
printf("unsorted");
}
🥓BC123 有序序列插入一个整数
解法一
#include <stdio.h>
int main()
{
int n, x, i;
scanf("%d\n", &n);
int arr[51] = {0};
for(i=0; i<n; i++)
scanf("%d ", &arr[i]);
scanf("%d\n", &x);
for(i = n; i>0; i--) //从后往前依次与x比较
{
if(arr[i-1] >= x) //x更小时,元素后移一位
arr[i] = arr[i-1];
else{
arr[i] = x; //x更大时,将x插入,跳出循环
break;
}
}
if(i==0) arr[i] = x; //易错点,for循环中不包括i=0的情况,要单独处理
for(i=0; i<=n; i++)
printf("%d ", arr[i]);
return 0;
}
🥓BC124 序列中删除指定数字
#include<stdio.h>
#define MAX 100
int main()
{
auto int n=0,x=0,arr[MAX];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
scanf("%d",&x);
for(int i=0;i<n;i++)
{
if(arr[i]!=x)
{
printf("%d ",arr[i]);
}
}
return 0;
}
🥓BC125 序列中整数去重
int main{
int n; //思路是定义两个数组
int arr1[60]={0}; //①作为输入数组,②作为输出数组
int arr2[60]={0};
scanf("%d",&n);
int g=0;
for(int i=0;i<n;i++){
int sum=0;
scanf("%d ",&arr1[i]);//输入数组①
for(int j=0;j<i;j++){
if(arr2[j]==arr1[i]){ //检测输出数组②中是否已经存在此数
sum=1;
break;
}
}
//sum=0说明if循环未进入则输出数组中无此数
//将满足的值输入二数组
if(sum==0){
arr2[g]=arr1[i];
g++;
}
}
for(int i=0;i<g;i++){ //输出②数组
printf("%d ",arr2[i]);
}
return 0;
}
🥓BC127筛选求素数法
#include <stdio.h>
int main()
{
int n = 0;
int arr[100] = { 0 };
//多组输入
while (~scanf("%d", &n))
{
//将2~n的数存起来
int i = 0; //循环变量
for (i = 2; i <= n; i++)
{
arr[i] = i;
}
//开始筛选
for (i = 2; i <= n; i++)
{
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
arr[i] = 0;
}
}
}
int cnt = 0;
//输出
for (i = 2; i <= n; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
else
{
cnt++;
}
}
printf("\n%d\n", cnt);
}
return 0;
}
🥓BC133 回型矩阵
#include <stdio.h>
int main() {
int arr[20][20], n;
scanf("%d", &n);
int up = 0, left = 0, right = n - 1, down = n - 1;
int x = 1;
while (x <= n * n)
{
for (int i = left; i <= right; i++)
{
arr[up][i] = x++;
}
up++;
for (int i = up; i <= down; i++)
{
arr[i][right] = x++;
}
right--;
for(int i = right;i>=left;i--)
{
arr[down][i] = x++;
}
down--;
for(int i = down;i>=up;i--)
{
arr[i][left] = x++;
}
left++;
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j<n;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
🥓BC134 蛇型矩阵
#include <stdio.h>
int array[1001][1001] = { 0 };
int main(void)
{
int n = 0;
scanf("%d",&n);
int i = 1, j = 1, k = 0,pos = 1; //pos代表方向移动 1代表右上 -1代表左下
array[i][j] = 1;
for (k = 2; k <= n*n; k++)
{
if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变 此后行增,列减
{
array[i][++j] = k;
pos = -1; //方向注意
}
else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变 此后行减,列增
{
array[++i][j] = k;
pos = 1; //方向注意
}
else if (j == n && pos==1) //碰到左边界,行增加1,列不变 此后行增,列减
{
array[++i][j] = k;
pos = -1; //方向注意
}
else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变 此后行减,列增
{
array[i][++j] = k;
pos = 1;
}
else if (pos == 1) //除去上面的边界情况,就是中间移动过程
{
array[--i][++j] = k;
}
else if(pos == -1)
{
array[++i][--j] = k;
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
printf("%d ",array[i][j]);
printf("\n");
}
return 0;
}
🥓BC136 判断上三角矩阵
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a[12][12], n, i, j, flag;
flag = 1;//假设三角矩阵成立
cin>>n;
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
cin>>a[i][j];
for(i = 1;i < n;i++)
{
for(j = 0;j < i;j++)
{
if(a[i][j] != 0) flag = 0;//若三角矩阵里出现一个非0的数,则该矩阵不成立
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
🥓BC139 矩阵交换
#include<stdio.h>
int main(void){
int m=0,n=0;
scanf("%d %d",&m,&n);
int s[m][n];
//int ss[n][m];//一开始想用两个矩阵,发现后面如果多组输入,更改的一直是初始矩阵,且代码繁杂,采用一个矩阵的方式
for(int i=0;i<m;i++){//初始化
for(int j=0;j<n;j++){
scanf("%d ",&s[i][j]);
}
}
int t=0;//变换次数
char flag='r';//判断行还是列变
int c1=0,c2=0;//变换的行(列)号
int temp=0;
scanf("%d ",&t);
while(t){
scanf(" %c %d %d",&flag,&c1,&c2);
c1--;c2--;//给的是行号,--之后才是数组下标值
if(flag=='r'){
for(int j=0;j<n;j++){
temp=s[c2][j];//交换c1和c2行
s[c2][j]=s[c1][j];
s[c1][j]=temp;
}
}
if(flag=='c'){
for(int i=0;i<m;i++){//交换C1和C2列
temp=s[i][c2];
s[i][c2]=s[i][c1];
s[i][c1]=temp;
}
}
t--;
}
//打印最终数组
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
printf("%d ",s[i][j]);
printf("\n");
}
return 0;
}
🥓BC140 杨辉三角
#include <stdio.h>
int main()
{
int n = 0;
int arr[30][30] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
if (0 == j || i == j)
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
printf("%5d", arr[i][j]);
}
printf("\n");
}
return 0;
}