鱼C论坛

 找回密码
 立即注册
查看: 1302|回复: 2

[已解决]牛客买铅笔问题

[复制链接]
发表于 2023-9-30 15:18:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  #include <stdio.h>
int main()
{
    int n,a,b,o,l[3]={0},min;
    scanf("%d",&n);
    for(int i=0;i<3;i++)
    {
        scanf("%d %d",&a,&b);
        
        l[i]=ceil(n/a)*b;
        min =l[0];
        for(int j=0;j<3;j++)
        {
            if(min>l[j])
                min=l[j];
        }
        
        
        
    }
    printf("%lf",min);
    return 0;
}


应该某个地方思路错了,求指正
   

最佳答案
2023-9-30 15:19:14
在你的代码中,出现了一些问题:

1. 数组 l 的定义应该是 double l[3] = {0},因为 ceil() 函数返回的是 double 类型的值。

2. l 数组的赋值操作是错误的,应该使用下标对单个元素进行赋值。

3. ceil() 函数需要包含头文件 math.h

4. printf() 函数中输出 %lf 会输出一个 double 类型的值,但是题目要求输出一个整数,所以应该使用 %d

5. min 没有初始化,如果 l 数组中的值都大于 n,那么 min 的值有可能会是一个随机值,因此需要初始化 min 为一个较大的值。

请参考以下修改后的代码:
#include <stdio.h>
#include <math.h>

int main() {
    int n, a, b;
    double l[3] = {0};
    scanf("%d", &n);
    for (int i = 0; i < 3; i++) {
        scanf("%d %d", &a, &b);
        l[ i] = ceil(n * 1.0 / a) * b;
    }
    int min = l[0];
    for (int j = 0; j < 3; j++) {
        if (min > l[j]) 
            min = l[j];
    }
    printf("%d", min);
    return 0;
}

在修改后的代码中,我们通过使用 ceil(n * 1.0 / a) 计算出购买铅笔的最小花费,然后在 l 数组中保存这个值。接着,我们遍历 l 数组,找到其中的最小值并将其输出。

需要注意的是,由于可能存在整数除法向下截断的问题,因此需要将 n 转换成浮点数,即 n * 1.0 / a,这样才能保证计算结果是正确的。
如果问题已经解决,请设置最佳答案
Snipaste_2023-09-30_15-16-54.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 15:18:34 | 显示全部楼层
代码问题

在你的代码中存在几个问题:

1. 在循环开始时,你定义了一个数组 l[3] 来保存三种不同铅笔包装的价格。但在后面的代码中,你将 l 赋值为一个 double 类型的值,这是错误的。你应该创建一个 double 类型的数组来保存计算得到的价格。

2. 在计算每种铅笔包装的价格时,你使用了 ceil(n/a) 来计算需要购买的包装数量,但在 C 语言中,整数除法的结果仍然是整数,即会向下取整。所以你需要将其中一个操作数转换为 double 类型,以得到正确的结果。

3. 在找到最小价格时,你使用了一个变量 min 来保存最小值,但你没有正确地初始化它。在比较之前,应该将 min 初始化为一个足够大的值,以确保它会被正确更新。

下面是修正后的代码:
#include <stdio.h>#include <math.h>int main(){    int n, a, b;    double min = INFINITY;    scanf("%d", &n);    for (int i = 0; i < 3; i++)    {        scanf("%d %d", &a, &b);        double price = ceil((double)n / a) * b;        if (price < min)            min = price;    }    printf("%.lf\n", min);    return 0;}
修正后的代码使用了 double 类型的变量来保存价格,并将其中一个操作数转换为 double 类型以进行精确的除法。同时,在比较之前正确地初始化了 min 变量。

希望这可以帮助到你!如果有任何问题,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 15:19:14 | 显示全部楼层    本楼为最佳答案   
在你的代码中,出现了一些问题:

1. 数组 l 的定义应该是 double l[3] = {0},因为 ceil() 函数返回的是 double 类型的值。

2. l 数组的赋值操作是错误的,应该使用下标对单个元素进行赋值。

3. ceil() 函数需要包含头文件 math.h

4. printf() 函数中输出 %lf 会输出一个 double 类型的值,但是题目要求输出一个整数,所以应该使用 %d

5. min 没有初始化,如果 l 数组中的值都大于 n,那么 min 的值有可能会是一个随机值,因此需要初始化 min 为一个较大的值。

请参考以下修改后的代码:
#include <stdio.h>
#include <math.h>

int main() {
    int n, a, b;
    double l[3] = {0};
    scanf("%d", &n);
    for (int i = 0; i < 3; i++) {
        scanf("%d %d", &a, &b);
        l[ i] = ceil(n * 1.0 / a) * b;
    }
    int min = l[0];
    for (int j = 0; j < 3; j++) {
        if (min > l[j]) 
            min = l[j];
    }
    printf("%d", min);
    return 0;
}

在修改后的代码中,我们通过使用 ceil(n * 1.0 / a) 计算出购买铅笔的最小花费,然后在 l 数组中保存这个值。接着,我们遍历 l 数组,找到其中的最小值并将其输出。

需要注意的是,由于可能存在整数除法向下截断的问题,因此需要将 n 转换成浮点数,即 n * 1.0 / a,这样才能保证计算结果是正确的。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表