我需要编写这个函数来计算获得指定值的最小硬币数。
作为参数的函数有一个值(int)和一个字符串,它包含有关硬币类型及其值的信息(它与硬币更改的经典版本略有不同)
作为一个例子:
coin(20, "a:9,b:2,c:1");
所以我的价值是20。 在这种情况下,我有一个名为' a'价值9,硬币' b'价值2和硬币' c'价值1 所以最后这个功能会让我回归' aab'我使用2次硬币' a'还有一次硬币' b'这是最低限度的 以下是一些其他测试用例:
assert(strcmp(coin(4, "a:5,b:2,c:1"),"bb")==0);
assert(strcmp(coin(12,"a:3,b:2"),"aaaa")==0);
希望有人可以帮助我。 我已经看到一些具有相同问题的示例(http://code.geeksforgeeks.org/jeuR48),但我真的不知道如何管理硬币类型
答案 0 :(得分:1)
这可以通过多种方式解决。这是一种可以帮助您入门的方法。
定义struct
以保存硬币名称和值:
struct CoinType
{
char name;
unsigned int value;
};
然后您需要解析输入字符串,即将其拆分为名称和值,并将其保存在数组中供以后使用。类似的东西:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct CoinType
{
char name;
unsigned int value;
};
int getCoins(struct CoinType **ct, char* s)
{
char *token;
char name;
unsigned int value;
int n = 0;
token = strtok(s, ",");
while(token)
{
if (sscanf(token, "%c:%u", &name, &value) != 2)
{
// Illegal input
exit(1);
}
*ct = realloc(*ct, (n+1)*sizeof(struct CoinType));
if (*ct == NULL)
{
// Out of mem
exit(1);
}
(*ct)[n].name = name;
(*ct)[n].value = value;
++n;
token = strtok(NULL, ",");
}
return n;
}
void printCoins(struct CoinType *ct, int n)
{
int i;
printf("Coins available:\n");
for (i=0; i<n; ++i)
{
printf("name=%c with value=%u\n", ct[i].name, ct[i].value);
}
}
void coin(unsigned int amount, char* s)
{
struct CoinType *ct = NULL;
int coins = getCoins(&ct, s);
printCoins(ct, coins);
// Add code to match a number of coins with amount
// Clean up
free(ct);
}
int main(void)
{
char s[] = "a:9,b:2,c:1";
coin(20, s);
return 0;
}
这将输出:
Coins available:
name=a with value=9
name=b with value=2
name=c with value=1