【打卡d1】算法模拟类
题目1
题目描述:
某百货公司为了促销,采用购物打折的优惠方法,每位顾客一次购物:在1000元以上者,按
9.5 折优惠;在2000以上者,按9折优惠;在3000以上者,按8.5 折优惠;在5000 以上者,按8折优惠;编写程序,购物款数,计算并输出优惠价。
输入样例:
850
1230
5000
3560
输出样例:
discount=1,pay=850
discount=0.95,pay=1168.5
discount=0.8,pay=4000
discount=0.85,pay=3026
第一次代码:
//促销问题
#include<bits/stdc++.h>
using namespace std;
int main(){
double a,b;
cin >> a;
if(a<1000) {
cout <<"dicount=1,pay="<<a<<endl;}
if(a>=1000&&a<2000) {
b= 0.95*a;
cout <<"dicount=0.95,pay="<<b<<endl;}
if(a>=2000&&a<3000){
b = 0.9*a;
cout<<"dicount=o.9,pay="<<b<<endl;}
if(a>=3000&&a<5000){
b = 0.85*a;
cout<<"dicount=o.85,pay="<<b<<endl;}
if(a>=5000) {
b = 0.8*a;
cout<<"dicount=o.8,pay="<<b<<endl;}
}
问题:
1.拼写错误:dicount
-> discount
2. 输出折扣时错误的 o
字符:o.9
, o.85
, o.8
- 问题:在输出折扣时,写成了
o.9
,o.85
,o.8
,其中的o
是错误的字符,它应该是数字0
。 - 解决方案:将
o.9
,o.85
,o.8
修改为0.9
,0.85
,0.8
。
3. 多余的 if
语句:可以使用 else if
- 问题:你使用了多个独立的
if
语句进行条件判断。当一个条件满足时,后续的条件也会继续判断。这样会导致不必要的多次判断。比如如果a >= 1000
且a < 2000
,后面的条件也会继续判断。
4. 没有规定输出格式:
- 解决方案:可以使用
fixed
和setprecision
来确保输出保持一位小数,或者使用printf("pay = %g\n")
进行更精确的控制。
#include <iostream>
using namespace std;
int main() {
double a, b;
cin >> a; // 输入一个购物金额
// 根据金额判断折扣并计算支付金额
if (a < 1000) {
cout << "discount=1,pay=" << a << endl; // 不打折,直接输出金额
}
else if (a >= 1000 && a < 2000) {
b = 0.95 * a;
cout << "discount=0.95,pay=" << b << endl; // 打9.5折
}
else if (a >= 2000 && a < 3000) {
b = 0.9 * a;
cout << "discount=0.9,pay=" << b << endl; // 打9折
}
else if (a >= 3000 && a < 5000) {
b = 0.85 * a;
cout << "discount=0.85,pay=" << b << endl; // 打8.5折
}
else if (a >= 5000) {
b = 0.8 * a;
cout << "discount=0.8,pay=" << b << endl; // 打8折
}
return 0;
}
题目二:
题目描述:
企业发放的奖金根据利润提成。
- 利润低于或等于 100000 元的,奖金可提成 10%;
- 利润高于 100000 元,低于 200000 元(100000 < l ≤ 200000)时,低于 100000 元的部分按 10% 提成,高于 100000 元的部分按 7.5% 提成;
- 利润高于 200000 元,低于 400000 元(200000 < l ≤ 400000)时,低于 200000 元的部分仍按上述办法提成(下同),高于 200000 元的部分按 5% 提成;
- 利润高于 400000 元,低于 600000 元(400000 < l ≤ 600000)时,高于 400000 元的部分按 3% 提成;
- 利润高于 600000 元,低于 1000000 元(600000 < l ≤ 1000000)时,高于 600000 元的部分按 1.5% 提成;
- 利润高于 1000000 元(l > 1000000),超过 1000000 元的部分按 1% 提成。
输入格式:
一个整数,表示当月利润 l
。
输出格式:
一个整数,表示应发奖金总数。
第一次写:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a;
if(a<=100000){
b=0.1*a;
cout<<b;
}
else if (100000<a<=200000){
b=100000*0.1+(a-100000)*0.075;
cout<<b;
}
else if(200000<a<=400000){
b=100000*0.1+100000*0.075+(a-200000)*0.05;
cout<<b;
}
else if (400000<a<=600000){
b=100000*(0.1+0.075+0.05)+(a-400000)*0.03;b=100000*0.1+100000*0.075+200000*0.05+(a-400000)*0.03;
cout<<b;
}
else if (600000<a<=1000000){
b=100000*(0.1+0.075+0.05+0.03)+(a-600000)*0.015;b=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(a-600000)*0.015;
cout<<b;
}
else if (a>1000000){
b=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015
cout<<b;
}
return 0;
}
错误一:
- C++ 不能写
100000 < a <= 200000
这样的连续比较运算,因为它会被解析为:(100000 < a) <= 200000
100000 < a
结果是true(1)
。然后1 <= 200000
这个条件永远成立,导致逻辑错误。
else if (a > 100000 && a <= 200000)
所有 else if
语句都需要修正!
错误二:
- 写法
100000 * (0.1 + 0.075 + 0.05)
少算了一部分税额 - 每个区间的税率适用于特定金额,不能直接把系数加起来计算
- 改成
100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05
这样累加每个区间的贡献才是正确的
#include <iostream>
using namespace std;
int main() {
int a;
double b; // 使用 double 处理小数
cin >> a; // 读取输入利润
if (a <= 100000) {
b = a * 0.1;
}
else if (a > 100000 && a <= 200000) {
b = 100000 * 0.1 + (a - 100000) * 0.075;
}
else if (a > 200000 && a <= 400000) {
b = 100000 * 0.1 + 100000 * 0.075 + (a - 200000) * 0.05;
}
else if (a > 400000 && a <= 600000) {
b = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (a - 400000) * 0.03;
}
else if (a > 600000 && a <= 1000000) {
b = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (a - 600000) * 0.015;
}
else {
b = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (a - 1000000) * 0.01;
}
cout << b << endl; // 输出最终奖金
return 0;
}
题目三:
求 Sn = a + aa + aaa + ... + a...a(共 n 个 a)之值,其中 a 是一个数字,n 为相加的个数。
示例:
若 a = 2, n = 5
,则计算:
2 + 22 + 222 + 2222 + 22222
输入格式:
输入两个数:
- 第一个为
a
,表示参与计算的数字。 - 第二个为
n
,表示a
需要累加多少项。
a
和 n
的取值范围:1 < a < 10
且 1 < n < 10
。
输出格式:
输出计算得到的总和。
第一次写:错误
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,n;
cin>>a>>n;
if(1<a<=10&&1<n<=10)格式错了{
//假设a=2,n=3.2+22+222
// a+(a*10+a)+((a*10+a)*10+a)
int x = a;
for(int i=1;i<=n;i++){
x = x*10+a;
n=n+x;
n
是输入的 次数,不应该修改n
!- 正确的做法: 需要使用
sum
变量 来存储累加和。}
cout<<n<<endl;
}
}
经点拨后:
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
int a, n;
int t = 0;
int sum = 0;
cin >> a >> n; // 输入 a 和 n
if(a>1&&a<=10&&n>1&&n<=10){
for(int i=1;i<=n;i++){
t = t*10+a;//计算当前项
sum = sum+t;
}
cout<<sum<<endl;
}
return 0;
}