链接到问题:https://www.codechef.com/problems/HS08TEST
说明
Pooja希望从ATM机上提取X美元。仅当X为5的倍数且Pooja的帐户余额中有足够的现金来执行提款交易(包括银行手续费)时,自动提款机才会接受交易。每次成功取款,银行收取0.50美元。尝试交易后计算Pooja的帐户余额。
输入
正整数0
负号0 <= Y <= 2000,精度为两位数-Pooja的初始帐户余额。
输出
尝试进行交易后输出帐户余额,以两位精度的数字给出。如果帐户中没有足够的资金来完成交易,请输出当前的银行余额。
示例-成功交易
输入: 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);
}
答案 0 :(得分:2)
函数内部的函数不是标准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);
}
}
答案 1 :(得分:1)
除了函数中的功能和缺失的返回值(顺便说一句未使用)之外,问题在于您永远不会检查帐户是否转为负数。
检查如果您使用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
答案 2 :(得分:0)
问题中的代码与问题说明存在一些偏差和潜在偏差:
float
的精度足以表示银行余额。<stdio.h>
。