Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 贪婪算法编译时不会出错,但在运行时不会通过第一个操作_C_Cs50_Greedy - Fatal编程技术网

C 贪婪算法编译时不会出错,但在运行时不会通过第一个操作

C 贪婪算法编译时不会出错,但在运行时不会通过第一个操作,c,cs50,greedy,C,Cs50,Greedy,所以我在用cs50,我在做贪婪算法现金问题,我写的代码编译得很好,但当我运行它时,它会要求以美元为单位的更改金额:然后永远不会接受有效的响应,我永远无法输入输入,什么也没有发生 一位朋友说我丢失了一个输入,这就是为什么它不工作的原因,但我正在尝试使用用户的输入,所以。。。非常感谢您的帮助,因为我想我真的很接近,我只是不知道如何修复它,help50说技术上没有问题,所以我只是处于停滞状态 谢谢大家! #include <cs50.h> #include <stdio.h>

所以我在用cs50,我在做贪婪算法现金问题,我写的代码编译得很好,但当我运行它时,它会要求以美元为单位的更改金额:然后永远不会接受有效的响应,我永远无法输入输入,什么也没有发生

一位朋友说我丢失了一个输入,这就是为什么它不工作的原因,但我正在尝试使用用户的输入,所以。。。非常感谢您的帮助,因为我想我真的很接近,我只是不知道如何修复它,help50说技术上没有问题,所以我只是处于停滞状态

谢谢大家!

#include <cs50.h>
#include <stdio.h>
#include <math.h>

int main(void)
{
    // identifying variables
float amount;
int cents;
int count = 0;

// prompting user for input
do
{
    amount = get_float("Change amount in USD: ");
}
// ensuring a positive number
while (amount < 0);

//changing float to an int
    cents = round(amount*100);

// using highest denomination first (quarters)
while (cents % 25 >= 0)
{
    count++;
    cents = cents % 25;
}

// using next highest denomination second (dimes)
while (cents % 10 >= 0)
{
    count++;
    cents = cents % 10;
}

// using next highest denomination third (nickels)
while (cents % 5 >= 0)
{
    count++;
    cents = cents % 5;
}

// using last denomination amount (pennies)
while (cents % 1 >= 0)
{
    count++;
    cents = cents % 1;
}

// displays number of coins used
printf("%i\n", count);

}

由于逻辑错误,您的系统陷入无限循环。查看while循环,例如:

而美分%25>=0 { 计数++; 美分=美分%25; } 模块操作将为您提供一个介于0和24之间的数字。无论原始值是多少,条件始终为真

您想将您的条件更新为其他条件。请注意,在您的while中,您应该以不同的方式更新美分,因为在第一次迭代之后,美分值不会改变:假设它是10。它进入while循环,然后美分=美分%25将保持10。静止无限循环

while (cents % 25 >= 0)
{
    count++;
    cents = cents % 25;
}
除法总是>=0,因此有一个无限循环,切换到

while (cents % 25 > 0)

问题在于这段代码以及类似的代码

//第一季度使用最高面额 而美分%25>=0 { 计数++; 美分=美分%25; } 这将导致基于任意整数值%25始终大于等于0的原则的无限循环。然而,这个问题实际上根本不需要mod操作。相反,检查减去硬币的值是否大于等于0,如果大于等于0,则执行减法

//第一季度使用最高面额 而美分-25>=0 { 计数++; 美分=美分-25美分; }
您使用什么输入来测试程序?我被指示使用随机的正值和负值,以确保负面响应导致重新询问,并且各种正数产生正确数量的硬币。这种更改是不够的,因为在循环中,他只接受变量的模件谢谢!我不能说我完全理解你在说什么,但我想我基本上理解你在说什么。这跟订单有关系吗?25美分比25美分更可行还是更不可行?我又看了一遍我的笔记,想这可能与此有关。你的代码打算做什么?在四分之一的时候给同样多的零钱,然后是10秒,以此类推?请尽量少用硬币换零钱我很抱歉,我更喜欢用单词而不是数字。有一个原则,任何整数值%25将始终>=0?为什么会这样?当然!%或模数运算符返回两个数字相除的余数。余数是将两个整数除后剩下的数。如果数字完全分开,余数是0,因为没有剩余。因此,0是最小余数,因为剩余的负数没有任何意义。另外,最大值是右边的数字减去一,因为如果再加一,数字将再次等分,这意味着余数是0。因此,任何数字%任何数字都大于或等于0,而不仅仅是25。