2017-07-16 68 views
0

我對編碼相當陌生,所以我相信這是一個愚蠢的問題。對於一個類,我需要編寫一個算法來確定最少的變化量,以便在C++中創造一定數量的金錢。將數值數據讀入一個數組,然後將下一行讀入一個變量。 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沒有成功,所以任何建議都會非常有幫助。

+4

您正在使用C++,因此請使用* C++。當'std :: vector'或其他容器可用時,不要使用C風格的數組。這將使您的代碼更簡單,不太可能產生愚蠢的錯誤,並打開整個世界的標準庫容器上運行的工具。 – tadman

回答

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試試吧。

0

這讀取完整的一行,並使用std::istringstream分開硬幣類型。下一行的總金額按通常的方式提取。

我改變了你的功能簽名,採取std::vectorint。如果您使用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::getline調用中使用的std::ws有消費從以前輸入的所有剩餘空格或換行。

相關問題