将数字数据行读入数组,然后将下一行读入变量。 C ++

时间:2017-07-16 19:41:21

标签: c++ arrays

我对编码很陌生,所以我确信这是一个愚蠢的问题。对于一个类,我需要编写一个算法来确定在C ++中赚取一些金钱的最小变化量。

此代码需要从txt文件中读取数字,以便第一行是硬币类型(即1美分,2美分,4美分等)。第二行是我想要分类为变化的总数。然后第三行是一组新的硬币类型,第四行是新的总数。一般模式仍在继续。

txt文件看起来像 -

1 2 5
10
1 3 7 12
29
1 2 4 8
15
1 7 11
14

我自己很容易创建了更改算法,我在将第一行读入数组然后将下一行读入变量时遇到问题。

我的coinChange算法代码。

    int coinChange(int coins[], int total, int size)
    {
        //Set high minimum
        int min = 999999999;
        //For all of the coins, see if it equals the value of total
        for (int i = 0; i < size; i++) {
            if (coins[i] == total) {
                //If so return 1
                return 1;
            }
        }
        //Loop through
        for (int j = 1; j <= total / 2; j++) {
            if ((coinChange(coins, j, size) + coinChange(coins, total - j, size)) < min) {
                min = coinChange(coins, j, size) + coinChange(coins, total - j, size);
            }
        }
        return min;
    }

我尝试过使用fgets和fscanf没有成功,所以任何建议都会非常有用。

2 个答案:

答案 0 :(得分:1)

如果您使用c ++作为tadman已经评论过,您可以使用类似的东西:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main()
{
    std::stringstream ss("1 2 5\n10\n1 3 7 12\n29\n");
    std::string line;

    while(std::getline(ss, line))
    {
        std::stringstream lines(line);
        std::vector<int> values;
        std::string string_value;

        while(std::getline(lines, string_value, ' '))
            values.push_back(std::stoi(string_value));

        std::getline(ss, line);

        int value = std::stoi(line);

        std::cout << "got: ";
        for(const auto& v : values) std::cout << v << ", ";
        std::cout << value << std::endl;
    }

    return 0;
}

在这里试试http://cpp.sh/33bmy

答案 1 :(得分:0)

这将读取一个完整的行并使用std::istringstream拆分硬币类型。下一行的总金额是以通常的方式提取的。

我更改了您的功能签名以获取indexPathForItem(at:)std::vector。如果您将int替换为size,则大部分代码应保持不变。

coins.size()

注意:在#include <iostream> #include <string> #include <sstream> #include <vector> int coinChange(const std::vector<int> &coins, int total) { // Set high minimum int min = 999999999; // // Your code here. Don't need a size parameter, use coins.size() instead // return min; } int main() { std::vector<int> coins; int total; std::string line; while (std::getline(std::cin >> std::ws, line) && std::cin >> total) { std::istringstream iss(line); for (int coin; iss >> coin; ) { coins.push_back(coin); } coinChange(coins, total); coins.clear(); // reset vector before the next inputs } } 调用中使用std::ws可以消耗先前输入的剩余空格或换行符。