C语言找零
㈠ c语言题小李是超市收银员,每次顾客付钱都要找零,求在目前纸币面额下(1角,
为了找零时能够保证纸币张数最少,我们需要先定义好纸币的面额,然后通过不断减去纸币面额的方式来计算需要找零的张数。以下是一个示例程序,实现了对于任意的零钱找零,找零所需的纸币张数最少:
c
Copy code
#include <stdio.h>
int main() {
int money[] = {100, 50, 20, 10, 5, 1}; // 纸币面额
int n = sizeof(money) / sizeof(int); // 纸币面额个数
int change, i, cnt = 0; // 需要找的零钱、循环变量、纸币张数
printf("请输入找零金额(元):");
scanf("%d", &change); // 输入需要找零的金额
change *= 10; // 转换为以角为单位的整数金额
for (i = 0; i < n; i++) {
cnt += change / money[i]; // 计算需要找的张数
change = change % money[i]; // 计算剩余的零钱
}
printf("需要找零%d张纸币\n", cnt); // 输出纸币张数
return 0;
}
在上述代码中,我们先定义了纸币面额数组 money,然后通过 sizeof 函数计算出纸币面额的个数 n。接下来,通过输入需要找零的金额 change,将其转换为以角为单位的整数金额。之后,使用循环遍历纸币面额数组,计算出需要找的张数,并用取余运算计算出剩余的零钱。最后,输出计算出的纸币张数即可
㈡ c语言 找零钱问题,谢谢
这很容易。
先输入n值,然后从最大面值的人民币开始减。例如:
我有238元
减最大面值的第一个。238-100=138。结果为正数且不为零。然后记录100元张数的变量加1(这些变量都应初始化时为0)
继续,138-100=38.结果正数且不为零,同上100面值变量加1,
38-100。结果小于零。不再用100面值的减。
38-50。结果同样小于零,不再用50面值的减。
38-20=18.结果为正数且不为零,20元张数的变量加1,
18-20。结果小于零。不再用20面值的减。
18-10=8。结果为正数且不为零,10元张数的变量加1,
8-10.结果小于零。不再用10面值的减。
8-5=3。结果为正数且不为零,5元张数的变量加1,
3-5。结果小于零。不再用5面值的减。
3-2=1.结果为正数且不为零,2元张数的变量加1,
1-1=0.结果为零。1元张数变量加1.显示结果。
你有:
100元(2)张,50元(0)张,20元(1)张,10元(1)张,5元(1)张,2元(1)张,1元(1)张。
㈢ C语言,贪心算法,货币找零问题
贪心算法找零就是现实中从最大面额开始找的思路。不代表是最优解,只是算法之一。
由于面额输入顺序不定,我先对输入的面额进行降序排序。
下面代码:
#include <stdio.h>
#include <malloc.h>
int main()
{
int i,j,m,n,*ns=NULL,*cn=NULL,sum=0;
printf("请输入总金额m及零钱种类n:"),scanf("%d",&m),scanf("%d",&n);
printf("请分别输入%d种零钱的面额: ",n);
if(!(ns=(int *)malloc(sizeof(int)*n))) return 1;
if(!(cn=(int *)malloc(sizeof(int)*n))) return 1;
for(i=0;i<n;i++) scanf("%d",&ns[i]);
//------------考虑输入面额顺序不定,先对面额进行降序排列(如按照降序输入,该段可删除)
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(ns[j]>ns[i]) ns[j]^=ns[i],ns[i]^=ns[j],ns[j]^=ns[i];
//-------------------------------------------------------------------
for(i=0;i<n;i++)//贪心算法,从最大面额开始
if(m>=ns[i])
cn[i]=m/ns[i],m=m%ns[i],sum+=cn[i],printf("%d元%d张 ",ns[i],cn[i]);
printf(" 最少使用零钱%d张 ",sum);
return 0;
}