题目如下:
“双十一”促销活动开始了,某商品规定“满2件打8折、满3件打7折”,但购买数量超出5件(不含)后,超出部分不打折,且单价上浮10%。请编写一段程序,计算各种情况下购买此商品需要支付的总金额。
输入
输入一个浮点数、一个整数,用空格分隔,分别作为商品单价和购物数量。
输出
输出一个浮点数,要求保留2位小数。
#include<stdio.h>
int main()
{float a,c;
int b;
scanf("%f %d",&a,&b);
switch (b){
case(1):c=a*b;break;
case(2):c=a*b*0.8;break;
case(3):c=a*b*0.7;break;
case(4):c=a*b*0.7;break;
case(5):c=a*b*0.7;break;
default:c=(a*5*0.7)+(a*1.1*(b-5));
}
printf("%.2f",c);
}
笨人在这里用的switch语句其实和if相同(使用方法不详细说了,请看c语言技能树)
但是这样会让代码看得简单一点,在一些具有相似条件下进行简单运算的分支语句里可以尝试使用。
进阶后
某企业需要一个奖金发放计算器,依据利润区间值和该区间的提成率,以及该企业当月实际利润,计算可用于发放的奖金金额。
例如:区间分界值和提成率如下表:
区间分界值 |
奖金提成率 |
含义 |
100,000 |
10% |
当利润低于100,000(含)时,奖金可提10% |
200,000 |
7.5% |
高于100,000,低于或等于200,000的部分,按7.5%提成。 |
400,000 |
5% |
高于200,000,低于或等于400,000的部分按5%提成。 |
600,000 |
3% |
高于400,000,低于或等于600,000的部分按3%提成 |
1,000,000 |
1.5% |
高于600,000,低于或等于1,000,000的部分按照1.5%提成 |
-1 |
1% |
高于1,000,000的部分按照1%提成 |
使用该计算方法,当用户输入不同的区间分界值、提成率和当月利润,计算并输出应发奖金总数。
【输入格式】
输入n+2行。
第1行包含一个整数n,表示有n行分界值和奖金提成率。
中间n行每行包含1个正整数和1个小数,整数表示区间分界值(并且按从小到大顺序输入),小数表示提成率,两个数字之间用一个空格分隔。注意:第n个区间分界值为-1,表示利润超出上一个区间分界值的其余情况;另外,输入的区间保证是连续、正确的。
第n+2行一个整数,表示当月利润,可正可负,如果利润为负,则输出“NO”。
【输出格式】
1行仅1个数字,表示为当月应发奖金总数,保留小数点后两位数。
如果利润为负,则输出“NO”。
#include <stdio.h>
int main() {
int n, j, i; //j是比哪几个
double d;//c是分隔提成档次,d是最终提成
i = 0; //i是要输入几个a和c
d = 0;
scanf("%d", &n);
int a[105];
double c[105];
int b; //n是有几种情况,a是分隔利润档次,b是本月利润
for (i = 0 ; i < n; i++)
scanf("%d %lf", &a[i], &c[i]);
scanf("%d", &b);
if (b < 0)
printf("NO\n");
else {
for (j = 0; j <= n - 2; j++) {
if (b > a[j]) {
if (j == 0 )
d = d + a[0] * c[0];
else
d = d + (a[j] - a[j - 1]) * c[j];
} else {
if (j >= 1)
d = d + (b - a[j - 1]) * c[j];
else
d = d + b * c[0];
break;
}
}
if (b > a[n - 2])
d += (b - a[n - 2]) * c[n - 1];
if (n == 1) {
d += (b ) * c[0];
}
printf("%.2lf", d);
}
return 0;
}
对,这里也有精度问题,把float换成double就行,注意一下其他地方的类型。
主要就是看逻辑写代码。没有特别的技巧。