本次测试1~5题
(共100分)
注意:打开相关源程序后,只能在//********与//=======之间编写程序,若修改其它部分可能得0分。
1. 找零钱问题:ChangeNote.cpp(本题20分) 【题目描述】 人民币中10圆以下的零钞由5圆、1圆、5角、1角、5分和1分组成。对于给定的需要找零的零钱数额m,编写程序,给出使用零钞(纸币和硬币)数目最少的找零方案。例如,对于零钱m=6.78圆,最佳的找零方案是5圆1张、1圆1个、5角1个、1角2个、5分1个和1分3个。
要求:(1)找零精确到‘分’,不足1分的零钱四舍五入;(2)只输出找零数目非0的零钞信息。
【输入】
输入文件ChangeNote.in中包含1个float类型的浮点数,表示零钱的数额m。
【输出】
输出文件ChangeNote.out为最佳找零方案,如输入输出样例所示。
【输入输出样例1】
ChangeNote.in ChangeNote.out
6.78 伍圆: 1
壹圆: 1
伍角: 1
壹角: 2
伍分: 1
壹分: 3
【输入输出样例2】
ChangeNote.in ChangeNote.out
32.236 伍圆: 6
壹圆: 2
壹角: 2
壹分: 4
【限制】
m>0。
#include <stdio.h>
char lingchao[10][10] = {
{
"伍圆"}, {
"壹圆"}, {
"伍角"}, {
"壹角"}, {
"伍分"}, {
"壹分"}}; //零钞名称
int sc[6]= {
500, 100, 50, 10, 5, 1}; // 6种零钞的面值,单位是分
int num[6]= {
0}; // 存储找零最优方案,即6种零钞的数目
int main() {
float m; //m-零钱数额
int mint; //mint-存放当前零钱面值总额
int i; //i-循环变量
printf("请输入的需要给付的零钱的金额(m): ");
FILE *fp;
if((fp=fopen("ChangeNote.in", "r")) != NULL ) {
fclose(fp); //存在的话,要先把之前打开的文件关掉
freopen("ChangeNote.in", "r", stdin);
freopen("ChangeNote.out", "w", stdout);
}
scanf("%f", &m); // 输入零钱数额,单位是元
//************************************************
//(1)将零钱转化为 "整分"
mint = int(m*100 + 0.5);
//(2)使用贪心策略, 寻找找零方案。A.币值最大的5元要几个? B.币值次大的1元要几个?C.币值第3大的5角要几个?...
for(i=0; i<6; i++) {
//(2.1)币值第i大的零钞票要几个?
num[i] = mint/sc[i];
//(2.2)还未给付的零钞的数目(扣除已经给付的)
mint -= sc[i]*num[i];
}
//(3)打印输出找零方案信息
for(i=0; i<6; i++) {
if(num[i] != 0) {
printf("%s: %d\n", lingchao[i], num[i]);
}
}
//=================================================
return 0;
}
#include <stdio.h>
int sc[6]= {
500, 100, 50, 10, 5, 1}; // 6种零钞的面值,单位是分
int num[6]= {
0}; // 存储找零最优方案,即6种零钞的数目
int main() {
float m; //m-零钱数额
int mint; //mint-存放当前零钱面值总额
int i; //i-循环变量
FILE *fp;
if((fp=fopen("ChangeNote.in", "r")) != NULL ) {
fclose(fp); //存在的话,要先把之前打开的文件关掉
freopen("ChangeNote.in", "r", stdin);
freopen("ChangeNote.out", "w", stdout);
}
scanf("%f", &m); // 输入零钱数额,单位是元
//************************************************
//(1)将零钱转化为 "整分"
mint = int(m*100 + 0.5);
//(2)使用贪心策略, 寻找找零方案。A.币值最大的5元要几个? B.币值次大的1元要几个?C.币值第3大的5角要几个?...
for(i=0; i<6; i++) {
//(2.1)币值第i大的零钞票要几个?
num[i] = mint/sc[i];
//(2.2)还未给付的零钞的数目(扣除已经给付的)
mint -= sc[i]*num[i];
}
//(3)打印输出找零方案信息
for(i=0; i<6; i++) {
if(num[i] != 0) {
switch(i) {
case 0:
printf("伍圆: %d\n", num[0]);
break