【发布时间】:2020-10-28 03:06:28
【问题描述】:
我正在尝试使用动态编程方法计算最小硬币面额,但我的代码在第二次查询后停止运行,即使如果我提供 T = 10 它应该运行 10 次。为什么它会停止?
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int min(int x, int y)
{
return (x < y) ? x : y;
}
short int min_denom(short int N)
{
short int *table, i, j, x;
table = (short int*)malloc(N * sizeof(short int));
for(i = 0; i < N; i++)
table[i] = 1 + i;
for(i = 1; i <= (short int)sqrt(N); i++)
for(j = 0; j < N; j++)
if(j == i)
table[j] = min(1, table[j]);
else if(j > i)
table[j] = min(table[j - i - 1] + 1, table[j]);
x = table[N - 1];
free(table);
return x;
}
int main()
{
short int T, N, i;
scanf("%d", &T);
for(i = 1; i < T; i++)
{
scanf("%d", &N);
printf("%d\n", min_denom((short int)N));
}
scanf("%d", &N);
printf("%d\n", min_denom((short int)N));
return 0;
}
输出是:
10
100
10
500
22
然后自动停止运行。
【问题讨论】:
-
为什么你使用
short int而不是int?这个MCU有KB内存吗?如果没有 - 你有大量的内存。 -
您应该使用
"%hd"而不是"%d" forshort int`。 -
@i486 我只是想让我的程序使用更少的内存,就是这样!
-
如果指定
%d,scanf() 会将一个四字节整数存储在一个两字节短整型变量中。剩下的两个字节将破坏堆栈上的下一个变量。 -
@ThomasJager 是的,它成功了!非常感谢!
标签: c memory dynamic-memory-allocation