【问题标题】:Correct outputs but codechef says wrong while submitting the code正确的输出,但 codechef 在提交代码时说错了
【发布时间】:2020-02-23 18:59:28
【问题描述】:

问题链接:https://www.codechef.com/problems/HS08TEST

说明

Pooja 想从 ATM 取款 X 美元。取款机只接受X为5的倍数,且Pooja账户余额有足够现金进行取款交易(包括银行手续费)的交易。对于每次成功取款,银行收取 0.50 美元的费用。尝试交易后计算 Pooja 的账户余额。

输入

正整数 0

非负数 0

输出

在尝试交易后输出帐户余额,以具有两位精度的数字形式给出。如果账户里没有足够的钱来完成交易,输出当前的银行余额。

示例 - 成功交易

输入: 30 120.00

输出: 89.50

示例 - 取款金额不正确(不是 5 的倍数)

输入: 42 120.00

输出: 120.00

示例 - 资金不足

输入: 300 120.00

输出: 120.00

当我在事务函数中更改参数时,我无法找到任何不正确的输出,但由于一些我无法找到的错误,我仍然无法成功提交。这是我第一次尝试使用 codechef 或者实际上是任何有竞争力的编程,所以任何帮助都将不胜感激。这是我的代码:

#define count 0.5

float transaction(int , float);

int main(void) 
{
    float transaction(int x, float acc_bal)
    {
        float z=acc_bal-(x+count);
        if(x<acc_bal)
        {
            if(x%5==0)
            {
                printf("%.2f",z);
            }   
        }

        if(x%5!=0)
        {
            printf("%0.2f",acc_bal);
        }
    }   

    transaction(42,120.00); 
}

【问题讨论】:

  • 您添加的链接不是公共访问。也许您应该在这里总结网站上的问题,以便我们了解您要做什么?
  • @Martin 那是提交页面。
  • @molbdnilo 是的,如果编译器支持函数中的函数。有些会,但不是全部。
  • 您的第一步应该是用标准 C 编写,而不是使用时髦的编译器特定的扩展。
  • 我建议您注意不精确的值。浮点值不能精确存储一些十进制值,例如0.10.01,因此有些人建议将整数用于currency problems

标签: c


【解决方案1】:

函数内部的函数不是标准的 C。一些编译器支持它,但是你依赖于编译器扩展。这样做:

#include <stdio.h>
#define count 0.5

float transaction(int x, float acc_bal)
{
    float z=acc_bal-(x+count);
    if(x<acc_bal)
    {
        if(x%5==0)
        {
            printf("%.2f",z);
        }   
    }

    if(x%5!=0)
    {
        printf("%0.2f",acc_bal);
    }
}   

int main(void) 
{
    transaction(42,120.00); 
}

但是您的代码不必要地混乱,并且缺少 x 大于余额的情况。此外,它不需要声明为浮点数。我会这样写:

void transaction(int x, float acc_bal)
{
    const float count = 0.5;
    float after=acc_bal-(x+count);

    if(x%5 == 0 && after>=0.0) {
        printf("%.2f\n",after);
    } else {
        printf("%0.2f\n",acc_bal);
    }
}   

【讨论】:

  • 谢谢,我正在尝试。当 x 可以大于 acc_bal 时,我也忘记了一个测试用例
【解决方案2】:

除了函数中的函数和缺少的返回值(顺便说一句,没有使用)之外,问题是您从不检查帐户是否变为负数。

检查如果您使用 transaction(100,100.45); 调用代码会发生什么

改为尝试:

#define count 0.5

void transaction(int x, float acc_bal)
{
    float z = acc_bal - count - x;  // z will be new balance if the transaction is made
    if (z >= 0 && x % 5 == 0)       // check if the transaction can be made
    {
        acc_bal = z;                // it could... so update balance
    }
    printf("%0.2f\n",acc_bal);      // print current balance
}   

int main(void) 
{
    transaction(100,100.45);  // not ok - can't pay bank charges
    transaction(99, 100.45);  // not ok - x is not a multiple of 5
    transaction(95, 100.55);  // ok
}

输出:

100.45
100.45
5.05

【讨论】:

    【解决方案3】:

    问题中的代码与问题规范存在若干偏差和潜在偏差:

    • 程序没有正确测试一笔交易是否可以完成,因为它测试的是请求的金额是否小于账户余额,而不是请求的金额加上提现费是否小于或等于余额。
    • 不知道float 是否有足够的精度来表示银行余额。
    • 程序无法以换行符结束输出行。 (虽然问题陈述没有明确说明这一点,但可能是隐含的。)
    • 程序未能包含&lt;stdio.h&gt;

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多