【牛客网题目解析:从入门到精通】173道基础题详解 (第七期)

在这里插入图片描述

😁本文作者:大家好,我是原始豌豆,欢迎来到牛客网刷题解析第七期,感谢你阅读本文欢迎评论,收藏,点赞哦。
😂内容专栏:这里是《牛客网在线编程》专栏,笔者用重金(时间和精力)打造,每道题目提供多种解法,从基础到拓展,希望可以帮到读者们。
😘写作不易:本文对每道题目提供了多种解法并加上了详细的注释,意在帮助读者锻炼思维灵活性,提高分析、解决问题的能力💓)。

开端
     在这篇文章中,我将分享刷题过程中的一些感悟、技巧和策略。我会详细解析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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值