蓝桥杯练习003

178 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

蓝桥杯练习003

1、题目 1010: [编程入门]利润计算

题目来源:[编程入门]利润计算 - C语言网 (dotcpp.com)

时间限制: 1Sec 内存限制: 128MB 提交: 41425 解决: 9306

题目描述

企业发放的奖金根据利润提成。利润低于或等于100000元的,奖金可提10%;
利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成 7.5%;
200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同),高于200000元的部分按5%提成;
400000<I≤600000元时,高于400000元的部分按3%提成;

600000<I≤1000000时,高于600000元的部分按1.5%提成;
I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。

输入

一个整数,当月利润。

输出

一个整数,奖金。

样例输入复制

900

样例输出复制

90

解题思路

//分析题目,可以得出本题是一个和条件表达式相关的题目,满足一定的条件,计算出奖金
//需要注意的是要认真审题,利润低于10w的直接与提成相乘即可,
//当利润高于10w低于20w的时候,分成两部分,10w的提成为0.1,超出的部分也就是利润减去10w之后的按提成0.075来计算
//后边的方式和之前一致
//假设利润为n,当n大于20w小于40w时,所得的奖金应为10w*0.01+10w*0.075+(n-20w)*0.05
//40w < n <=60w , 所得奖金为10w*0.01+10w*0.075+20w*0.05+(n-40w)*0.03
//60w < n <=100w ,所得奖金为10w*0.01+10w*0.075+20w*0.05+20w*0.03+(n-60w)*0.015
//n >100w,所得奖金为10w*0.01+10w*0.075+20w*0.05+20w*0.03+40w*0.015+(n-100w)*0.01
//最后输出结果即可

//需要注意的是,审题一定要仔细,开始我的思路是将超出的部分按所给提成相乘,而把在范围之内的没有再进行分解,以致于只通过了部分测试用例,利用宏定义的时候,所给的数值一定要正确,所谓正确就是和你想要的数据是一致的,之前提交过的代码的_40w 的值被我赋值为300000,以致于我认为是代码逻辑问题,这种问题应当避免。

代码示例

#include<iostream>
using namespace std;

#define _10w   100000
#define _20w   200000
#define _40w   400000
#define _60w   600000
#define _100w  1000000
int main()
{
	int n;
	int bonus;
	cin>>n;
	if(n<=_10w)
		bonus=n*0.1;
	else if(n>_10w&&n<=_20w)
		bonus=_10w*0.1+(n-_10w)*0.075;
	else if(n>_20w&&n<=_40w)
		bonus=_10w*0.1+_10w*0.075+(n-_20w)*0.05;
	else if(n>_40w&&n<=_60w)
		bonus=_10w*0.1+_10w*0.075+_20w*0.05+(n-_40w)*0.03;
	else if(n>_60w&&n<=_100w)
		bonus=_10w*0.1+_10w*0.075+_20w*0.05+_20w*0.03+(n-_60w)*0.015;
	else 
		bonus=_10w*0.1+_10w*0.075+_20w*0.05+_20w*0.03+_40w*0.015+(n-_100w)*0.01;
	cout<<bonus<<endl;
	return 0;
}

2.题目 1004: [递归]母牛的故事

题目来源:[递归]母牛的故事 - C语言网 (dotcpp.com)

时间限制: 1Sec 内存限制: 128MB 提交: 84418 解决: 26005

题目描述

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。

输出

对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

样例输入复制

2
4
5
0

样例输出复制

2
4
6

在这里插入图片描述

解题思路

分析题目,得到如下的递推式

在这里插入图片描述

代码示例

#include<iostream>
using namespace std;
  
int main () {
    //cows数组表示第i年的牛的总数
    int cows[56] = {0,1,2,3,4};
    for(int i = 4; i < 55; i ++) 
        cows[i] = cows[i-1] + cows[i-3];
    int n;
    while(scanf("%d", &n) && n) 
        cout << cows[n] << endl;
    return 0;
}

递归函数

int getCount(int year) {
    if(year < 4) {
        return year;
    } else {
        return getCount(year-1)+getCount(year-3);
    }
}

注意

需要注意的是采用递归可能会超时,采用for循环效率会比较高

3.题目 1011: [编程入门]最大公约数与最小公倍数

题目来源:[编程入门]最大公约数与最小公倍数 - C语言网 (dotcpp.com)

时间限制: 1Sec 内存限制: 128MB 提交: 38812 解决: 21528

题目描述

输入两个正整数m和n,求其最大公约数和最小公倍数。

输入

两个整数

输出

最大公约数,最小公倍数

样例输入复制

5 7

样例输出复制

1 35

解题思路

//求解最大公因数和最小公倍数的方式比较多,辗转相除法等。
//我采用的是简单易理解的方式来求解
//1.输入两个数m和n
//2.判断m和n的大小
//3.最大公因数一定会小于等于m和n中的较小的那个数,而最小公倍数一定大于等于m和n中较大的那个数
//4.用循环去判断
//5.当m与n分别对i取余,并且余数都为0的时候,说明找到了最大公因数和最小公倍数,此时需要跳出循环。
//6.无论m和n谁大谁小,都需要执行两个循环,这里采用异或的方式,m^n作为判断条件,省去一部分代码
//7.说明:求最小公倍数的循环终止条件设置为m与n的乘积,最大不会超过二者乘积。

示例代码

#include<iostream>
using namespace std;
int result(int m,int n)
{
	if(m^n)
	{
		for(int i=n;i>0;i--)
			if(m%i==0&&n%i==0)
			{
				cout<<i<<" ";
				break;	
			}
		for(int j=m;j<m*n+1;j++)
			if(j%m==0&&j%n==0)
			{
				cout<<j<<endl;
				break;
			}
	}
	
}
int main()
{
	int m,n;
	cin>>m>>n;
	result(m,n);
	return 0;
}
#include<stdio.h>
int main()
{
	int m,n,i,j;
   	scanf("%d%d",&m,&n);
   	if(m>n)
   	{
       for(i=n;i>0;i--)
        {
            if((m%i==0)&&(n%i==0))
            {
            	printf("%d ",i);
            	break;
            }
        }
        for(j=m;j<m*n+1;j++)
        {
            if((j%m==0)&&(j%n==0))
            {
                printf("%d ",j);
                break;
            }
        }
   }
    if(m<n)
   	{
     	for(i=n;i>0;i--)
        {
            if((m%i==0)&&(n%i==0))
            {
            	printf("%d ",i);
            	break;
            }
        }
        for(j=n;j<m*n+1;j++)
        {
            if((j%m==0)&&(j%n==0))
            {
                printf("%d ",j);
                break;
            }
        }
   }
   return 0;
}