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

简介: 【C语言】牛客网刷题训练-11

针对C语言入门OJ题

(简单)BC111-小乐乐与进制转换_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int arr[40] = {0};//所给空间够用即可
    int i = 0;
    scanf("%d", &n);
    while(n)
    {
        arr[i] = n%6;
        i++;
        n = n/6;
    }
    for(i--; i>=0; i--)
    {
        printf("%d", arr[i]);
    }
    
    return 0;
}

(简单)BC112-小乐乐求和_牛客题霸_牛客网

参考代码:

#include <stdio.h>
//代码1
int main()
{
    long long i = 0;
    long long sum = 0;
    long long n = 0;
    scanf("%lld", &n);
    for(i=1; i<=n; i++)
   {
        sum += i;
   }
    printf("%lld\n", sum);
    return 0;
}
//代码2
int main()
{
    long long n = 0;
    scanf("%lld", &n);
    printf("%lld", (1+n)*n/2);//等差数列求和公式
    return 0;
}

(简单)BC113-小乐乐定闹钟_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int h = 0;//hour
    int m = 0;//minute
    int k = 0;//要睡的时长
    scanf("%d:%d %d", &h, &m, &k);
    //注意:这里要先算h,如果先算m,则会将赋值后的m代到h的公式中
    h = ((m+k)/60+h)%24;//24进制
    m = (m+k)%60;
    printf("%02d:%02d\n", h, m);
    return 0;
}

(简单)BC114-小乐乐排电梯_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d\n", (n/12)*4+2);//每趟12人,一整趟4分钟,上去需要2分钟
    
    return 0;
}

(中等)BC115-小乐乐与欧几里得_牛客题霸_牛客网

参考代码:

#include <stdio.h>
//暴力求解:
//耗时太久,无法满足条件
int main()
{
    long long n = 0;
    long long m = 0;  
    scanf("%lld %lld", &n, &m);
 
    long long max = n>m?m:n;//假设n和m的较小值为最大公约数
    while(max)
    {
        if(n%max==0 && m%max==0)
        {
            break;
        }
        max--;
    }
 
    long long min = m>n?n:m;//假设n和m的较大值为最小公倍数
    while(min)
    {
        if(min%n==0 && min%m==0)
        {
            break;
        }
        min++;
    }
    printf("%lld\n", max+min);
    return 0;
}
//辗转相除法:
#include <stdio.h>
int main()
{
    long long n = 0;
    long long m = 0;
    long long tmp = 0;    
    scanf("%lld %lld", &n, &m);
    int a = n;
    int b = m;
    while(tmp=a%b)
    {
        a = b;
        b = tmp;
    }
    //b - 最大公约数
    //n*m/b - 最小公倍数
    printf("%lld\n", b+n*m/b);
    return 0;
}

(中等)BC116-小乐乐改数字_牛客题霸_牛客网

参考代码:

#include <stdio.h>
#include <math.h>
int main()
{
    int n = 0;
    int sum = 0;
    scanf("%d", &n);
    int i = 0;
    while(n)
    {
        //计算每一位
        int m = n%10;
        //判断奇偶数
        if (m % 2 == 1)
            m = 1;//奇数
        else
            m = 0;//偶数
        sum += m * pow(10, i);
        n/=10;
        i++;
    }
    printf("%d", sum);
    return 0;
}

(简单)BC117-小乐乐走台阶_牛客题霸_牛客网

解析:

  1. 如果只有1级台阶,那显然只有一种跳法。
  2. 如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级。
  3. 如果台阶级数大于2,设为n的话,这时我们把 n 级台阶时的跳法看成n的函数,记为 f(n),第一次跳的时候有2种不同的选择:一是第一次跳一级,此时跳法的数目等于后面剩下的 n-1 级台阶的跳法数目,即为 f(n-1),二是第一次跳二级,此时跳法的数目等于后面剩下的 n-2 级台阶的跳法数目,即为 f(n-2),因此 n 级台阶的不同跳法的总数为 f(n) = f(n-1) + f(n-2),不难看出就是斐波那契数列。

参考代码:

#include <stdio.h>
int fib(int n)
{
    if(n<=2)
        return n;
    else
        return fib(n-1)+fib(n-2);
}
 
int main()
{
    int n = 0;
    scanf("%d", &n);    
    int ret = fib(n);
    printf("%d\n", ret);
    return 0;
}

拓展:

【剑指Offer】算法题-青蛙跳台阶的问题

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?

答题思路(与上面解析相同)

注意:这里需要注意一下溢出的问题,因为在 swift 里若相加溢出,则会直接crash,所以这里相加使用了 &+,溢出后返回nil。

func fibonacci(number: UInt64) -> UInt64? {
    if number == 1 {
        return 1
    }else if number == 2 {
        return 1
    }
    var fibNMinusOne:UInt64 = 1
    var fibNMinusTwo:UInt64 = 1
    var fibN:UInt64 = 0
    for _ in 3...number {
        fibN = fibNMinusOne &+ fibNMinusTwo
        if(fibN < fibNMinusOne) {
            return nil
        }
        fibNMinusTwo = fibNMinusOne
        fibNMinusOne = fibN
    }
    return fibN
}

若把条件修改成一次可以跳一级,也可以跳2级...也可以跳上n级呢?

思路

  1. 如果台阶级数为 n 的话,这时我们把 n 级台阶时的跳法看成 n 的函数,记为 f(n),第一次跳的时候有 n 种不同的选择:若是第一次跳一级,此时跳法的数目等于后面剩下的 n-1 级台阶的跳法数目,即为 f(n-1),若是第一次跳 m(m<n) 级,此时跳法的数目等于后面剩下的 n-m 级台阶的跳法数目,即为 f(n-m),若是第一次跳 n 级,此时跳法的数目等于1。                            所以 f(n)=f(n-1)+f(n-2)+...+f(n-m)+...+f(2)+f(1)+1
  2. 因此 f(n-1)=f(n-2)+...+f(n-m)+...+f(2)+f(1)+1
  3. 两式相减得到 f(n)=2*f(n-1)
  4. 因此可以得到下面的结果

f(n)=f(n-1)+f(n-2)+...+f(n-m)+...+f(2)+f(1)+1

     =1+f(1)+f(2)+...+f(n-m)+...+f(n-2)+f(n-1)

     =1+f(1)+2*f(1)+...+2^(n-m-1) * f(1)+...2^(n-3) *f(1)+2^(n-2) *f(1)

     =1+1+2+...+2^(n-m-1)+...2^(n-3)+2^(n-2)

     =2^(n-1)

答案:

若把条件修改成一次可以跳一级,也可以跳2级...也可以跳上n级呢,则 f(n)=2^(n-1)

(参考:剑指Offer算法题-青蛙跳台阶的问题 - 简书

(简单)BC118-小乐乐与序列_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int n = 0;
    int arr[100001] = {0};
    int i = 0;
    int tmp = 0;
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &tmp);
        arr[tmp] = tmp;
    }
    for(i=0;i<n;i++)
    {
        if(arr[i] != 0)
            printf("%d ", arr[i]);
    }
    return 0;
}

(中等) BC119- 小乐乐与字符串_牛客题霸_牛客网

解析:

  1. 这道题中的子串可以是不连续的。
  2. ch 的个数其实和前面出现的 c 的个数有关,chn 的个数和 n 之前 ch 的个数有关。

参考代码:

#include <stdio.h>
//这个题找到的不只是连续的子串
//只要在字符串中找到几个字符能组合成子串就算是“子串”
int main()
{
    char str[8000] = {0};
    int count = 0;
    scanf("%s", str);
    //统计字符串CHN的个数
    char * p = str;
    long long c = 0;
    long long ch = 0;
    long long chn = 0;
    while(*p)
    {
        if(*p == 'C')
            c++;
        else if(*p == 'H')
            ch+=c;
        else if(*p == 'N')
            chn += ch;
        
        p++;
    }
    printf("%lld\n", chn);
    return 0;
}

(入门)BC123-小乐乐找最大数_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int arr[4] = {0};
    int i = 0;
    for(i=0; i<4; i++)
    {
        scanf("%d", &arr[i]);
    }
    //假设arr[0]是最大值
    int max = arr[0];
    for(i=1; i<4; i++)
    {
        if(arr[i]> max)
        {
            max = arr[i];
        }
    }
    printf("%d\n", max);
    return 0;
}

(入门)BC125-小乐乐转换成绩_牛客题霸_牛客网

参考代码:

#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 90 && score<=100)
        printf("A\n");
    else if(score >= 80 && score <= 89)
        printf("B\n");
    else if(score >= 70 && score <=79)
        printf("C\n");
    else if(score >= 60 && score <= 69)
        printf("D\n");
    else if(score >= 0 && score <= 59)
        printf("E\n");
    else
        printf("F\n");
    return 0;
}

(简单)BC129-小乐乐计算函数_牛客题霸_牛客网

参考代码:

//代码一
#include <stdio.h>
int max3(int a, int b, int c)
{
    int max = a;
    if(b>max)
        max = b;
    if(c>max)
        max = c;
    return max;
}
 
int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    scanf("%d %d %d", &a, &b, &c);
    float m = ((float)max3(a+b,b,c)/(max3(a,b+c,c)+max3(a,b,b+c)));
    
    printf("%.2f\n", m);
    return 0;
}
//代码二
#include <stdio.h>
int max3(int a, int b, int c)
{
    int max = a>b ? a:b;
    max = max>c ? max:c;
    return max;
}
 
int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    scanf("%d %d %d", &a, &b, &c);
    float m = ((float)max3(a+b,b,c)/(max3(a,b+c,c)+max3(a,b,b+c)));
    
    printf("%.2f\n", m);
    return 0;
}


相关文章
|
3月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
14 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