【C语言】编程初学者入门训练(12)

111. 小乐乐与欧几里得

  • 问题描述:小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。

  • 输入描述:每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)

  • 输出描述
    对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。

  • 示例1

    • 输入:10 20
    • 输出:30
  • 示例2

    • 输入:15 20
    • 输出:65
  • 解题思路

    • 最大公约数辗转相除法,用 n % m,如果结果不等于 0 则说明没找到最大公约数,此时将 m 的值赋给 n ,然后将 n % m 得到的结果赋给 m,重复上述步骤直到 n % m 等于 0 的时候,此时 m 为最大公约数。
    • 最小公倍数:n * m / 最大公约数,注意要先保留 n 和 m 的值,不然在求最大公约数的过程中就将这俩给改了。
  • 代码实现

#include <stdio.h>
int main()
{
        long long n,m,max,min,t;
        scanf("%lld %lld",&n,&m);

        long n1 = n,m1 = m;

        //最大公约数
        while(0 != (t = n % m))
        {
                n = m;
                m = t;
                //此时m为最大公约数
        }
        max = m;

        //最小公倍数
        min = n1 * m1 / max;

        printf("%lld\n",max + min);
        return 0;
}

112. 小乐乐改数字

  • 问题描述:小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少。
  • 输入描述:输入包含一个整数n (0 ≤ n ≤ 109)
  • 输出描述:输出一个整数,即小乐乐修改后得到的数字。
  • 示例1
    • 输入:222222
    • 输出:0
  • 示例2
    • 输入:123
    • 输出:101
  • 解题思路:当拿出个十百位上得出奇偶数然后转换成0/1之后,还需要将得出的数放回原来的个十百位上。
  • 代码实现
#include <stdio.h>
#include <math.h>

int main()
{
        int n,k,i = 0,sum = 0;
        scanf("%d",&n); 

        while(n)
        {
                k = n % 10;
                if(1 == k % 2)
                {
                        k = 1;
                }
                else
                {
                        k = 0;
                }
                sum += k * pow(10,i);
                i++ ;
                n /= 10;
        }
        printf("%d\n",sum);
        return 0;
}

113. 小乐乐走台阶

  • 问题描述:小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
  • 输入描述:输入包含一个整数n (1 ≤ n ≤ 30)
  • 输出描述:输出一个整数,即小乐乐可以走的方法数。
  • 示例1
    • 输入:2
    • 输出:2
  • 示例2
    • 输入:10
    • 输出:89
  • 解题思路
    1. 如果只有 1 级台阶,那么只有一种跳法。
    2. 如果有 2 级台阶,那么就有 2 种跳法,一种是分 2 次跳,每次跳 1 级,另一种就是一次跳 2 级。
    3. 如果台阶树大于 2,设为 n 的话,这时候把 n 级台阶时的跳法看成 n 的函数,记为 f(n),第一次跳的时候有两种不同的选择:
      • 一是第一次跳一级,此时跳法的数目等于后面剩下的 n-1 级台阶的跳法数目,即为 f(n-1),
      • 二是第一次跳二级,此时跳法的数目等于后面剩下的 n-2 级台阶的跳法数目,即为 f(n-2),
    • 因此 n 级台阶的不同跳法总数为:f(n) = f(n-1) + f(n-1),瞪眼法看这就是个斐波那契数数列。

在这里插入图片描述

  • 代码实现
#include <stdio.h>
int f(int n)
{
        if(n <= 2)	return n;
        
        else		return f(n-1) + f(n-2);        
}
int main()
{
        int n;
        scanf("%d",&n);//n个台阶
        printf("%d\n",f(n));
        return 0;
}

114. 小乐乐与序列

  • 问题描述:老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他。
  • 输入描述:第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n)
  • 输出描述:输出一行,为去重排序后的序列,每个数后面有一个空格。
  • 示例1
输入:4
	2
	2
	1
	1
输出:1 2 
  • 示例2
输入:5
	5
	4
	3
	2
	1
输出:1 2 3 4 5 
  • 解题思路
    1. 创建一个具足够带下的数组并将其完全初始化为 0。
    2. 假设遇到 1,则将 1 存到下标为 1 的位置去,之后如果再遇到 1 同样是将其存进下标为 1 的位置上去,就能搞定去重了。遇到其他正整数同理。
    3. 当全部存完之后,再将数组从前往后遍历,数组中非 0 的元素就是去重之后的结果。
  • 代码实现
#include <stdio.h>
#define MAX 100001

int main()
{
        int n,i,tmp;
        int arr[MAX] = {0};
        scanf("%d",&n);

        for(i = 1;i <= n;i++)
        {
                scanf("%d",&tmp);
                arr[tmp] = tmp;
        }
        for(i = 1;i <= n;i++)
        {
                if(0 != arr[i])
                {
                        printf("%d ",arr[i]);
                }
        }
        return 0;
}

115. 小乐乐与字符串

  • 问题描述:在庆祝祖国母亲70华诞之际,老师给小乐乐出了一个问题。大家都知道China的英文缩写是CHN,那么给你一个字符串s,你需要做的是统计s中子序列“CHN”的个数。子序列的定义:存在任意下标a < b < c,那么“s[a]s[b]s[c]”就构成s的一个子序列。如“ABC”的子序列有“A”、“B”、“C”、“AB”、“AC”、“BC”、“ABC”。
  • 输入描述:输入只包含大写字母的字符串s。(1 ≤ length ≤ 8000)
  • 输出描述:输出一个整数,为字符串s中子序列“CHN”的数量。
  • 示例1
    • 输入:CCHNCHN
    • 输出:7
  • 示例2
    • 输入:CCHNCHNCHNCHN
    • 输出:30
  • 解题思路:H之前出多少个C很重要,决定了会出现多少个CH,所以要先统计出现了多少个C,然后CH决定了有几个CHN会出现,所以之后要统计CH出现的次数。
  • 代码实现
#include <stdio.h>
int main()
{
        char arr[8000] = {0};
        scanf("%s",arr);

        //统计子串 CHN 的个数
        long long c = 0,ch = 0,chn = 0;
        char* p = arr;

        while(0 != *p)
        {
                if('C' == *p)
                {
                        c++ ;
                }
                else if('H' == *p)
                {
                        ch += c;
                }
                else if('N' == *p)
                {
                        chn += ch;
                }
                p++ ;
        }
        printf("%lld\n",chn);
        return 0;
}

116. 小乐乐算平均分

  • 问题描述:小乐乐输入三科成绩,请编程帮他输出三科成绩总分及平均分。
  • 输入描述:一行,3科成绩(浮点数),成绩之间用一个空格隔开。
  • 输出描述:一行,总分和平均分(小数点后保留两位),用一个空格隔开。
  • 示例
    • 输入:79.5 80.0 98.0
    • 输出:257.50 85.83
  • 代码实现
#include <stdio.h>

int main()
{
        float a,b,c;
        scanf("%f %f %f",&a,&b,&c);

        printf("%.2f %.2f\n",(a+b+c),(a+b+c)/3.0);

        return 0;
}

117. 小乐乐找最大数

  • 问题描述:小乐乐获得4个最大数,请帮他编程找到最大的数。
  • 输入描述:一行,4个整数,用空格分开。
  • 输出描述:一行,一个整数,为输入的4个整数中最大的整数。
  • 示例
    • 输入:5 8 2 5
    • 输出:8
  • 代码实现
#include <stdio.h>
int main()
{
        int arr[4] = {0};
        int i;
        for(i = 0;i < 4;i++)
        {
                scanf("%d",&arr[i]);
        }
        //假设arr[0]就是最大值
        int max = arr[0];
        for(i = 0;i < 4;i++)
        {
                if(arr[i] > max)
                {
                        max = arr[i];
                }
        }
        printf("%d\n",max);

        return 0;
}

118. 小乐乐是否被叫家长

  • 问题描述:小乐乐的班级进行了一次期中考试,考试一共有3门科目:数学,语文,英语,小乐乐的班主任决定给没有通过考核的同学家长开一次家长会,考核的标准是三科平均分不低于60分,所以现在想请你帮忙算一算小乐乐会不会被叫家长。

  • 输入描述:一行,输入三个整数(表示小乐乐的数学、语文、英语的成绩),用空格分隔。

  • 输出描述:一行,如果小乐乐会被请家长则输出“YES”,否则输出“NO”。

  • 示例1

    • 输入:80 60 50
    • 输出:NO
  • 示例2

    • 输入:70 55 40
    • 输出:YES
  • 代码实现

#include <stdio.h>
int main()
{
        int Chinese,math,English;
        scanf("%d %d %d",&Chinese,&math,&English);
        int average = (Chinese + math + English) / 3;

        if(average >= 60)       printf("NO\n");
        else                    printf("YES\n");

        return 0;
}

119. 小乐乐转换成绩

  • 问题描述:小乐乐输入百分制成绩,他想将成绩转换成等级制。转换规则为:90-100为’A’,80-89为’B’,70-79为’C’,60-69为’D’,59以下为’E’。如果输入的成绩不在0-100之间,输出’F’。
  • 输入描述:一行,一个整数表示的成绩。
  • 输出描述:一行,转换后的等级。
  • 示例
    • 输入:78
    • 输出:C
  • 代码实现
#include <stdio.h>
int main()
{
        int n;
        scanf("%d",&n);

        if(n >= 90 && n <= 100)
                printf("A\n");
        else if(n >= 80 && n <= 89)
                printf("B\n");
        else if(n >= 70 && n <= 79)
                printf("C\n");
        else if(n >= 60 && n <= 69)
                printf("D\n");
        else if(n >= 0 && n <= 59)
                printf("E\n");
        else
                printf("F\n");

        return 0;
}

120. 小乐乐算多少人被请家长

  • 问题描述:小乐乐的班主任想统计一下班级里一共有多少人需要被请家长,三个成绩(语文,数学,外语)平均分低于60的将被请家长,小乐乐想编程帮助班主任算一下有多少同学被叫家长。
  • 输入描述:共n+1行第一行,输入一个数n,代表小乐乐的班级中有n个同学。
    在接下来的n行中每行输入三个整数代表班级中一个同学的三科成绩(语文,数学,外语),用空格分隔。
  • 输出描述:一行,一个整数,代表班级中需要被请家长的人数。
  • 示例
输入:3
		80 100 90	
		40 70 65
		20 84 93
输出:1
  • 代码实现
#include <stdio.h>
int main()
{
        int n,a,b,c;
        int count = 0;
        scanf("%d",&n);

        for(int i = 0;i < n;i++)
        {
                scanf("%d %d %d",&a,&b,&c);
                if((a + b + c) / 3 < 60)
                {
                        count++;
                }
        }
        printf("%d\n",count);

        return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值