当前位置: 首页 > news >正文

【打卡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 >= 1000a < 2000,后面的条件也会继续判断。
4. 没有规定输出格式:
  • 解决方案:可以使用 fixedsetprecision 来确保输出保持一位小数,或者使用 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 需要累加多少项。

an 的取值范围:1 < a < 101 < 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;

}

 

相关文章:

  • `component`定义
  • 什么情况下使用分库分表
  • 本地服务重启-端口占用-显示和美国ip有个连接?存在恶意程序或是间谍程序?
  • RK3568平台(音频篇)audio_policy_volumes_drc.xml解析
  • STM32项目分享:STM32万年历(升级版)
  • 什么是时序数据库?有哪些时序数据库?常见的运用场景有哪些?
  • 国自然面上项目|基于海量多模态影像深度学习的肝癌智能诊断研究|基金申请·25-03-07
  • 超越经典:量子通信技术的发展与未来
  • 基于springboot和spring-boot-starter-data-jpa快速操作mysql数据库
  • Vue.js框架设计核心要素解析
  • 消息系统队列(Message Queue)之kafka
  • WSL安装及问题
  • 字节码是由什么组成的?
  • C++ 之字节取反
  • STM32常见外设的驱动示例和代码解析
  • 性能测试和Jmeter
  • C语言_数据结构总结6:链式栈
  • MySQL作业一
  • 量子计算测试挑战:软件测试将如何迎接新纪元?
  • 步进电机软件细分算法解析与实践指南
  • 青岛公司网站建设公司排名/今日新闻摘抄二十条
  • 自建企业邮箱/网站seo的优化怎么做
  • 租用网站服务器价格/百度指数人群画像
  • 有什么做服装的网站/网页搜索快捷键
  • 义乌网站建设公司代理/近期重大新闻
  • 目前做网站流行的语言/网络营销与直播电商好就业吗