【问题标题】:Transform Java Class into program in C将Java类转换为C中的程序
【发布时间】:2017-07-27 07:14:11
【问题描述】:

我正在创建一个程序,以最少数量的硬币返回其余部分。在输入中,我有一组硬币削减及其数量。我做了一个谨慎工作的java克隆。现在我需要把它变成 C,一种我准备不足的语言。谁能帮我? 我的主要问题是如何将结果返回给 C。在 java 中作为整个数组的列表返回。像这样:[1, 0, 0, 1, 0]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Change {
int[] values = {10,20,50,100,200};

public static void main(String[] args) {
    int[] values = {7, 2, 3, 6, 0};
    int[] ammounts = {1, 1, 1, 1, 0};
    List<Integer[]> results = solutions(values, ammounts, new int[5], 13, 0);
    for (Integer[] result : results){
        System.out.println(Arrays.toString(result));
    }


}

public static List<Integer[]> solutions(int[] values, int[] ammounts, int[] variation, int price, int position){
    List<Integer[]> list = new ArrayList<>();
    int value = compute(values, variation);
    if (value < price){
        for (int i = position; i < values.length; i++) {
            if (ammounts[i] > variation[i]){
                int[] newvariation = variation.clone();
                newvariation[i]++;
                List<Integer[]> newList = solutions(values, ammounts, newvariation, price, i);
                if (newList != null){
                    list.addAll(newList);
                }
            }
        }
    } else if (value == price) {
        list.add(myCopy(variation));
    }
    return list;
}

public static int compute(int[] values, int[] variation){
    int ret = 0;
    for (int i = 0; i < variation.length; i++) {
        ret += values[i] * variation[i];
    }
    return ret;
}

public static Integer[] myCopy(int[] ar){
    Integer[] ret = new Integer[ar.length];
    for (int i = 0; i < ar.length; i++) {
        ret[i] = ar[i];
    }
    return ret;
}

}

这是我目前的代码:

struct final_list *solution_change(struct rest * r, struct variation * v, struct final_list *lfinale, int price, int position) {
int value = compute(r, v);
if (value < price) {
    for (int i = position; i < r->max_lenght; i++) {
        if (r->coin[i].number_coin > v->variation[i]) {
            struct variation *newVar = v;
            newVar->variation[i]++;
            // recall the function (is recursive) i also need help here
            if (newVar != NULL) {
                if (lfinale->lenght == 0) {
                    lfinale->lenght++;
                    lfinale->variation = (struct variation *)calloc(lfinale->lenght, sizeof(struct variation));
                }
                else {
                    lfinale->lenght++;
                    lfinale->variation = (struct variation *)realloc(lfinale->variation, lfinale->lenght * sizeof(struct variation));
                }
                lfinale->variation[lfinale->lenght] = *newVar;
            }
        }
    }
}
else if (value == price) {
    //add myCopy
    lfinale->variation[lfinale->lenght] = *v;
}

我的结构:

struct coin {
  unsigned int value_coin; // value money
  unsigned int number_coin; // amount money
};

struct rest {
  unsigned int max_lenght;
  struct coin *coin;
};

struct variation {
  int lenght;
  int *variation;
};

struct final_list {
int lenght;
variation *variation;
};

【问题讨论】:

  • 所以...你尝试了什么?
  • 我编辑我的问题
  • 请提供MCVE。此外,如果仅使用英语(就像您在 Java 代码中所做的那样),示例代码会更容易阅读/理解。
  • 我改了意大利名字,对不起
  • 目前看起来不错!我喜欢你使用结构来构建数据的方式。有什么问题?

标签: java c dynamic-programming coin-change


【解决方案1】:

只需返回lfinale

您实际上不需要返回它,因为您已经在调用函数中拥有它。

在调用函数中:

struct final_list results;
results.lenght = 0;
results.variaton = NULL;

solution_change(&lrest, &lvariation, &results, price, position);

// results has now been populated.

这相当于在调用之前创建List,然后将其作为参数发送。

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多