本文已参与「新人创作礼」活动,一起开启掘金创作之路。
蓝桥杯练习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;
}