这是我第一次在这里发帖,如果我没有遵循正确的礼仪,我深表歉意。我也尝试寻找答案,但无济于事。
基本上,我有一个贪婪的硬币变化算法的函数,它以一些 int 作为输入。在我的函数中,我返回一个包含每个硬币的malloc'd数组。虽然它在大多数情况下有效,但由于某种原因,任何产生 5、9、...(+4( 硬币作为最佳分布,即 9 将是 (5 + 1 + 1 +1 + 1(,或 650,即 13 个硬币,每个硬币 50 个,导致程序中止并显示以下消息:
hello: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) &&
old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse
(old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)
但是,每个不是 5 或 5+4+ 的硬币分配......工程。不知道该怎么办。
这是函数:
int* greedyAlg(int value)//computes and returns the optimal (minimum) number of denominations for a given value for US currency
{
//denominations
int one = 1, five = 5, ten = 10, twenty = 20, fifty = 50;
int x5 = 0, x4 = 0, x3 = 0, x2 = 0, x1 = 0;
int count = 0;
//int[] denom;
while(value != 0)
{
if(value >= fifty)
{
value -= fifty;
count++;
x5++;
/*while(value >= fifty)
{
// int *i = &fifty;
value-=fifty;
count++;
x5++;
}*/
}
else if(value < fifty && value >= twenty)
{
value -= twenty;
count++;
x4++;
}
else if(value < twenty && value >= ten)
{
value -= ten;
count++;
x3++;
}
else if(value < ten && value >= five)
{
value -= five;
count++;
x2++;
}
else if(value < five && value >= one)
{
value -= one;
count++;
x1++;
}
}
//printf("Optimal denominations: ");
int* denom = malloc(sizeof(int)*(count + 1));
//int* denom = (int *)calloc(count + 1,sizeof (int));
denom[0]=count;
for(int i = 1; i<= (x5 + 1); i++){
denom[i] = fifty;
}
for(int i= (x5 + 1); i<=(x5 + x4) + 1; i++){
denom[i] = twenty;
}
for(int i = (x5 + x4) + 1; i <= ( x5 + x4 +x3 ) + 1; i++){
denom[i] = ten;
}
for(int i = (x5 + x4 + x3) + 1; i <= (x5 + x4 + x3 + x2) + 1; i++){
denom[i] = five;
}
for(int i = (x5 + x4 + x3 + x2) + 1; i <= (x5 + x4 + x3 + x2 + x1) + 1; i++){
denom[i]=one;
}
return denom;
free(&denom);
//return count;
}
这就是我打印它的方式:
//prints elements of array created by (greedy) coin change algorithm
void printGreedyArr(int arr[], size_t count)
{
for(int i = 1; i <= count; i++)
{
printf("%s%d%s, ","[",arr[i],"]");
}
printf("n%s %dn","count was",count);
}
我用第 0 个索引来调用它,它的长度是这样的:
printGreedyArr(greedyAlg(x),greedyAlg(x)[0]);
(在我的代码中,我设置了一个循环,其中 x 作为用户输入进行测试(
如果需要,我可以发布任何其他相关详细信息。
假设count
等于x5+x4+x3+x2+x1
,你有一个错误:
for(int i=(x5+x4+x3+x2)+1; i<=(x5+x4+x3+x2+x1)+1; i++){
应该是:
for(int i=(x5+x4+x3+x2)+1; i<(x5+x4+x3+x2+x1)+1; i++){
其他for
循环也是如此。请注意,终止条件已从<=
更改为<
。
也:
return denom;
free(&denom);
该free()
永远不会被执行,如果您将其放置在其他地方,则应从denom
之前删除&
。