Я пишу программу для смены монет. Когда я пишу printf в циклах для печати, программа i или j дает хорошие результаты, когда я удаляю ее, программа останавливается. Я думаю, что это проблема с памятью, но я пишу на Windows в QT, и у меня нет доступа к valgrind.
Кто-нибудь может это проверить? Сначала дайте номера деноминаций, второй — деноминации, последний — количество.
Например:
3
1 3 5
8
результат должен быть 2.
1
5
3
результат должен быть НЕТ.
#include <stdio.h>
#include <stdlib.h>
#define INF 2147483647 //nieskonczonoscvoid nominal(int nominaly, int T[], int k)
{
int i;
for (i=1; i<=nominaly; i++ )
{
int n=0;
scanf("%d", &n);
int j;
for ( j=0;j<=k-n;++j) {
if (T[j] < INF)
if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;
}
}
int kwota=0;
scanf("%d", &kwota);
if(T[kwota]==INF){
printf("NO");
}else
printf("%d", T[kwota]);
}
int main() {
int n=0;
scanf("%d", &n);
int k=10000;
int *T;
T = (int*)malloc(k * sizeof(int));
T[0]=0;
int i;
for (i=1;i<=k;++i)
{
T[i]=INF;
}
nominal(n, T, k);
free(T);
return 0;
}
Предполагая, что входные данные правильно сформированы, единственная проблема, которую я могу заметить в вашем коде, заключается в следующих строках:
if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;
когда j
достигает значения k-n
, T[j+n]
это за пределами доступа, потому что вы получаете k-n+n
Итак, вы получаете доступ T[k]
и последняя действительная позиция T[k-1]
, Это вызывает неопределенное поведение в вашей программе — может произойти все что угодно (включая работу, как ожидалось).
Вы можете переписать это for
цикл к чему-то вроде:
for (j=0; j < k-n;++j) { ... }
В вашем коде нет утечек памяти.
Других решений пока нет …