鱼C论坛

 找回密码
 立即注册
查看: 1887|回复: 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 为一个较大的值。

请参考以下修改后的代码:

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main() {
  4.     int n, a, b;
  5.     double l[3] = {0};
  6.     scanf("%d", &n);
  7.     for (int i = 0; i < 3; i++) {
  8.         scanf("%d %d", &a, &b);
  9.         l[ i] = ceil(n * 1.0 / a) * b;
  10.     }
  11.     int min = l[0];
  12.     for (int j = 0; j < 3; j++) {
  13.         if (min > l[j])
  14.             min = l[j];
  15.     }
  16.     printf("%d", min);
  17.     return 0;
  18. }
复制代码


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

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

使用道具 举报

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

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

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

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

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

下面是修正后的代码:
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.     int n, a, b;
  6.     double min = INFINITY;
  7.     scanf("%d", &n);
  8.     for (int i = 0; i < 3; i++)
  9.     {
  10.         scanf("%d %d", &a, &b);
  11.         double price = ceil((double)n / a) * b;
  12.         if (price < min)
  13.             min = price;
  14.     }
  15.     printf("%.lf\n", min);
  16.     return 0;
  17. }
复制代码

修正后的代码使用了 double 类型的变量来保存价格,并将其中一个操作数转换为 double 类型以进行精确的除法。同时,在比较之前正确地初始化了 min 变量。

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://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 为一个较大的值。

请参考以下修改后的代码:

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main() {
  4.     int n, a, b;
  5.     double l[3] = {0};
  6.     scanf("%d", &n);
  7.     for (int i = 0; i < 3; i++) {
  8.         scanf("%d %d", &a, &b);
  9.         l[ i] = ceil(n * 1.0 / a) * b;
  10.     }
  11.     int min = l[0];
  12.     for (int j = 0; j < 3; j++) {
  13.         if (min > l[j])
  14.             min = l[j];
  15.     }
  16.     printf("%d", min);
  17.     return 0;
  18. }
复制代码


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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 19:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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