【C语言】牛客网刷题训练-9

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C语言】牛客网刷题训练-9

针对C语言入门OJ题

(入门)BC87-统计成绩_牛客题霸_牛客网 (nowcoder.com)

解析:

输入的同时对最大值和最小值进行求和,然后计算出最后的结果。

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    double sum = 0.0;
    double avg = 0.0;
    double min = 100.0;//假设的最低分
    double max = 0.0;//假设的最高分
    double score = 0.0;
    int i = 0;
    scanf("%d", &n);//输入n科成绩
    for(i=0; i<n; i++)
    {
        scanf("%lf", &score);
        sum += score;
        if(score > max)
            max = score;
        if(score < min)
            min = score;
    }
    avg = sum/n;
    //输出
    printf("%.2lf %.2lf %.2lf\n", max, min, avg);
    return 0;
}

(简单)BC89-密码验证_牛客题霸_牛客网 (nowcoder.com) 

解析:

密码是字符串,字符串的比较函数可以使用 strcmp 函数。

参考代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char password1[20] = {0};//密码长度题目中没有直接说明 - 适度即可
    char password2[20] = {0};
    scanf("%s %s", password1, password2);
    //判断输入的两次密码是否一致 - 比较两个字符串
    //使用库函数 - strcmp
    if(strcmp(password1, password2) == 0)
        printf("same\n");
    else
        printf("different\n");
    return 0;
}

(简单)BC90-矩阵计算_牛客题霸_牛客网 (nowcoder.com)

解析:

在输入的同时,将大于 0 的数求和。

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n,&m);
    //获取n行m列的矩阵
    int i = 0;
    int j = 0;
    int num = 0;
    int sum = 0;//表示和
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d", &num);
            if(num > 0)
                sum += num;
        }
    }
    printf("%d", sum);
    return 0;
}

(简单)BC91-逆序输出_牛客题霸_牛客网 (nowcoder.com)

参考代码:

#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int i= 0 ;
    //输入
    for(i=0; i<10; i++)
    {
        scanf("%d", &arr[i]);
    }
    //输出 - 逆序
    for(i=9; i>=0; i--)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

扩展:

如果这个题不仅仅是逆序输出,而是要将数组中的数据逆序存放,又如何进行处理呢?

——每一对元素进行交换,然后再从前往后进行打印。

(例:1 2 3 4 5 6 7 8 9 10 —— 将1与10 2与9 ... ... 5与6交换)

(简单)BC93-统计数据正负个数_牛客题霸_牛客网 (nowcoder.com)

参考代码:

#include <stdio.h>
int main()
{
    //接收10个数
    int i = 0;
    int num = 0;
    int positive = 0;//正数个数
    int negative = 0;//负数个数
    for(i=0; i<10; i++)
    {
        scanf("%d", &num);
        if(num>=0)
            positive++;
        else
            negative++;
    }
    printf("positive:%d\n", positive);
    printf("negative:%d\n", negative);
    return 0;
}

(简单)BC94-N个数之和_牛客题霸_牛客网 (nowcoder.com)

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int num = 0;
    int sum = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &num);
        sum += num;
    }
    printf("%d\n", sum);
    return 0;
}

(简单)BC95-最高分与最低分之差_牛客题霸_牛客网 (nowcoder.com)

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int max = 0;
    int min = 100;
    scanf("%d", &n);
    int i = 0;
    int score = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &score);
        if(score > max)
            max = score;
        if(score < min)
            min = score;
    }
    printf("%d\n", max-min);
    return 0;
}

(简单)BC96-有序序列判断_牛客题霸_牛客网 (nowcoder.com)

解析:

题目中设置 2 个标记变量, flag1和 flag2 ,满足相邻 2 个元素升序就把 flag1 设置为 1 ,满足相邻 2 个元

素降序就把 flag2 设置为 1。 如果 flag1 flag2 都是 1 ,那就是乱序。

参考代码:

//代码一
#include <stdio.h>
int main()
{
    int n = 0;
    int arr[50] = {0};
    scanf("%d", &n);
    int i = 0;
    int flag1 = 0;//升序
    int flag2 = 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;
        }
    }
    //flag1 和 flag2 都为1是乱序的
    if(flag1+flag2 > 1)
        printf("unsorted\n");
    else
        printf("sorted\n");
    return 0;
}
//代码二
#include <stdio.h>
int main()
{
    int n = 0;
    int arr[50] = {0};
    scanf("%d", &n);
    int i = 0;
    int flag1 = 0;//升序
    int flag2 = 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;
        }
    }
    //flag1 和 flag2 都为1是乱序的
    //其中一个为1,则加起来一共为1
    if(flag1+flag2 == 1)
        printf("sorted\n");
    else
        printf("unsorted\n");
    return 0;
}

(简单)BC98-序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)

解析:

需要考虑删除多个相同数字的这种情况。

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int arr[50] = {0};
    int del = 0;
    //输入数据
    scanf("%d", &n);
    int i = 0;//遍历数组
    //读取n个数字
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //读取要删除的数字
    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;
}

(简单)BC99-序列中整数去重_牛客题霸_牛客网 (nowcoder.com)

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int arr[5000] = {0};
    //输入数据
    scanf("%d", &n);
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //去重
    for(i=0; i<n; i++)
    {
        //判断arr[i]是否在后边出现
        int j = 0;
        for(j=i+1; j<n; j++)
        {
            //先找出相同的元素
            //如果相等,要将其后续的元素往前移动
            if(arr[i] == arr[j])
            {
                //去重 - 后边的元素往前覆盖
                int k = 0;
                for(k=j; k<n-1; k++)
                {
                    arr[k] = arr[k+1];
                }
                n--;//去重一个,个数少1
                j--;
                //如果去重了arr[j]
                //把下一个位置的数字arr[j+1],放在新的arr[j]上
                //恰好又和arr[i]相同,所以也要再判断
            }
        }
    }
    for(i=0;i<n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

(简单)BC100-有序序列合并_牛客题霸_牛客网 (nowcoder.com)

解析:

  1. 只是打印出合并后的结果,所以不需要存储。
  2. 先在个数组中找较小的一个打印,等有一个数组中没有元素了,打印另外一个数组剩下的元素。

参考代码:

//代码一
#include <stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    int arr1[100] = {0};
    int arr2[100] = {0};
    //输入n和m
    scanf("%d %d", &n, &m);
    //输入两个升序序列
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //合并有序序列
    int j = 0;
    i = 0;
    while(i<n && j<m)
    {
        if(arr1[i] < arr2[j])
        {
            printf("%d ", arr1[i]);
            i++;
        }
        else
        {
            printf("%d ", arr2[j]);    
            j++;
        }
    }
    if(i == n)
    {
        for(; j<m; j++)
        {
            printf("%d ", arr2[j]);
        }
    }
    else
    {
        for(; i<n; i++)
        {
            printf("%d ", arr1[i]);
        }
    }
    return 0;
}
//代码二
#include <stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    int arr1[100] = {0};
    int arr2[100] = {0};
    //输入n和m
    scanf("%d %d", &n, &m);
    //输入两个升序序列
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //合并有序序列
    int j = 0;
    i = 0;
    while(i<n && j<m)
    {
        if(arr1[i] < arr2[j])
        {
            printf("%d ", arr1[i++]);
        }
        else
        {
            printf("%d ", arr2[j++]);
        }
    }
    if(i == n)
    {
        for(; j<m; j++)
        {
           printf("%d ", arr2[j]);
        }
    }
    else
    {
        for(; i<n; i++)
        {
            printf("%d ", arr1[i]);
        }
    }
    return 0;
}


相关文章
|
3月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
15 0
|
3月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
3月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
3月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
5月前
|
C语言
C语言刷题(函数)
C语言刷题(函数)
|
5月前
|
C语言
C语言刷题(数组)
C语言刷题(数组)
|
5月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
5月前
|
C语言
C语言刷题(循环结构程序设计)
C语言刷题(循环结构程序设计)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3