计算最少的零钱给你的客户
Counting the least amount of change to give your client
我正在统计剩余的硬币数量,以便给客户最少的硬币数量。
但是最后一枚硬币0.01
总是算错
我总是得到硬币的数量-1
。
get_float()
是接受浮点数输入的特殊函数。
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int count;
do {
coin = get_float("enter the owed change?");
//printf("your cash %f", coin);
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
//if (coin > 0.000000 && coin < 1.000000) {
count = 0;
while ((coin - 0.25) > 0) {
coin -= 0.25;
count++;
}
while ((coin - 0.10) > 0) {
coin -= 0.10;
count++;
}
while ((coin - 0.05) > 0) {
coin -= 0.05;
count++;
}
while ((coin - 0.01) > 0) {
coin -= 0.01;
count++;
}
if (coin == 0.01) {
count++;
}
//if (coin == 0.00) {
printf("%d", count);
//}
//}
}
典型的float
可以编码正好大约232个不同的值。
0.10、0.05、0.01 都是 而不是 个。
取而代之的是使用一个非常接近的值。
正是这种近似导致了问题。
而是使用整数 0.01
(分):
// prototype for `round()`
#include <math.h>
do {
// coin = get_float("enter the owed change?");
coins = round(100.0 * get_float("enter the owed change?");
printf("\n");
// } while(coin<=0.00 || coin>1.00);
} while(coin <= 0 || coin > 100);
...
// while((coin-0.10)>0)
while((coin - 10) > 0)
浮点数不能准确表示0.1
、0.05
、0.01
等小数。即使 coins
中的和也不能准确表示,除非是 0.75
、0.5
或 0.25
。当您减去这些值时,非常小的错误会累积并导致比较产生意外结果。
您应该小心地将总和转换为美分的整数,或者在您的测试中允许不精确。
此外,您的测试不正确:例如 while ((coin - 0.25) > 0)
应该是 while ((coin - 0.25) >= 0)
这是第一种方法的修改版本:
#include <math.h>
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int cents;
int count;
do {
coin = get_float("enter the owed change?");
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
cents = roundf(coin * 100);
count = 0;
while (cents >= 25) {
counts -= 25;
count++;
}
while (cents >= 10) {
cents -= 10;
count++;
}
while (cents >= 5) {
cents -= 5;
count++;
}
while (cents >= 1) {
cents -= 1;
count++;
}
printf("%d coins\n", count);
return 0;
}
这可以简化为:
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int cents;
int count;
do {
coin = get_float("enter the owed change?");
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
cents = round(coin * 100);
count = cents / 25;
cents %= 25;
count += cents / 10;
cents %= 10;
count += cents / 5;
cents %= 5;
count += cents;
printf("%d coins\n", count);
return 0;
}
我正在统计剩余的硬币数量,以便给客户最少的硬币数量。
但是最后一枚硬币0.01
总是算错
我总是得到硬币的数量-1
。
get_float()
是接受浮点数输入的特殊函数。
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int count;
do {
coin = get_float("enter the owed change?");
//printf("your cash %f", coin);
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
//if (coin > 0.000000 && coin < 1.000000) {
count = 0;
while ((coin - 0.25) > 0) {
coin -= 0.25;
count++;
}
while ((coin - 0.10) > 0) {
coin -= 0.10;
count++;
}
while ((coin - 0.05) > 0) {
coin -= 0.05;
count++;
}
while ((coin - 0.01) > 0) {
coin -= 0.01;
count++;
}
if (coin == 0.01) {
count++;
}
//if (coin == 0.00) {
printf("%d", count);
//}
//}
}
典型的float
可以编码正好大约232个不同的值。
0.10、0.05、0.01 都是 而不是 个。
取而代之的是使用一个非常接近的值。
正是这种近似导致了问题。
而是使用整数 0.01
(分)
// prototype for `round()`
#include <math.h>
do {
// coin = get_float("enter the owed change?");
coins = round(100.0 * get_float("enter the owed change?");
printf("\n");
// } while(coin<=0.00 || coin>1.00);
} while(coin <= 0 || coin > 100);
...
// while((coin-0.10)>0)
while((coin - 10) > 0)
浮点数不能准确表示0.1
、0.05
、0.01
等小数。即使 coins
中的和也不能准确表示,除非是 0.75
、0.5
或 0.25
。当您减去这些值时,非常小的错误会累积并导致比较产生意外结果。
您应该小心地将总和转换为美分的整数,或者在您的测试中允许不精确。
此外,您的测试不正确:例如 while ((coin - 0.25) > 0)
应该是 while ((coin - 0.25) >= 0)
这是第一种方法的修改版本:
#include <math.h>
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int cents;
int count;
do {
coin = get_float("enter the owed change?");
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
cents = roundf(coin * 100);
count = 0;
while (cents >= 25) {
counts -= 25;
count++;
}
while (cents >= 10) {
cents -= 10;
count++;
}
while (cents >= 5) {
cents -= 5;
count++;
}
while (cents >= 1) {
cents -= 1;
count++;
}
printf("%d coins\n", count);
return 0;
}
这可以简化为:
#include <stdio.h>
#include <cs50.h>
int main(void) {
float coin;
int cents;
int count;
do {
coin = get_float("enter the owed change?");
printf("\n");
} while (coin <= 0.00 || coin > 1.00);
cents = round(coin * 100);
count = cents / 25;
cents %= 25;
count += cents / 10;
cents %= 10;
count += cents / 5;
cents %= 5;
count += cents;
printf("%d coins\n", count);
return 0;
}