2014-10-31 100 views
0

我正在嘗試執行我的項目,並且卡住了。如果我理解,我的教授希望我使用動態數組,並且有一個函數可以比較整數並得到它們的GCD。我不能讓這個功能起作用。有什麼想法嗎? 這裏是舞會:動態數組和函數

寫一個程序來計算任何有限整數集的最大公約數。使用函數來計算GCD。該集合中的元素數量不應該預先確定。當您輸入數據時,您需要編寫將要計數的代碼,集合中有多少個數字。以歐幾里德算法爲基礎。

我輸入10,100和40 GCD應該是10,但是,我得到這個結果:

The GCD of: is: 
    10   0  
    100   0 
    40   0 

#include <iostream> 
#include<iomanip> 

using namespace std; 

int greatestdivisor(int b[], int size); /*Write prototype for gcd */ 

int main() 
{ 
    int greatest; 
    int max=1; 
    int* a= new int[max]; //allocated on heap 
    int n=0; 

    cout<<"Input numbers: "<<endl; 
    cout<<"Hit Enter key after each input and type any letter to finish"<<endl; 

    while(cin>>a[n]){  //read into array 
     n++; 
     if(n>=max){ 
      max=n; //increase size of array 
      int* temp = new int[max]; //creates new bigger array 

      for(int i=0;i<n;i++){ 
       temp[i] = a[i]; //copy values to new array 
      } //end for 
      delete [] a;  //free old array memory 
      a = temp;  //a points to new array 
     } //end if 

    } // end while 
    cout<<endl; 
    greatest = greatestdivisor(a, max); 
    cout<<"The GCD of: "<<" is: "<<endl; 
    for(int j=0;j<max;j++) 
     cout<<setw(5)<<a[j]<<setw(10)<<greatest<<endl; 
    n++;// prints elements of array and call function 
} // end main 

// gcd finds greatest common divisor of array 
int greatestdivisor(int b[], int size) 
{ 
    int greatest =1;// current greatest common divisor, 1 is minimum 

    for (int x=0; x<=size; x++) { 
     int m=b[x]; 
     int r=2; 
     if(m%r==0){ 
      greatest =m; // update greatest common divisor 
     } //end if 
    } // end for 
    return greatest; //return gcd 
} // end fuction gcd 
+0

'我不能讓功能工作。'你的程序出了什麼問題,請提供更多細節。 – user657267 2014-10-31 06:02:28

+0

當我運行它時,它顯示不正確的信息。它應該顯示10與我輸入的數據。 – Meeeeee 2014-10-31 06:06:35

+1

如果您正在拍攝gcd算法,您的'mostdivisor'函數似乎不會做太多工作,而且它的測試條件應該是'x WhozCraig 2014-10-31 06:07:34

回答

2

有在你的代碼中的許多問題, try this並找出你在做什麼錯:

#include <iostream> 
#include<iomanip> 

using namespace std; 

int greatestdivisor(int b[], int size); /*Write prototype for gcd */ 

int main() 
{ 
    int greatest; 
    int max=1; 
    int* a= new int[max]; //allocated on heap 
    int n=0; 

    cout<<"Input numbers: "<<endl; 
    cout<<"Hit Enter key after each input and type any letter to finish"<<endl; 

    while(cin>>a[n]){  //read into array 
     n++; 
     if(n>=max){ 
      max=n+1; //increase size of array 
      int* temp = new int[max]; //creates new bigger array 

      for(int i=0;i<n;i++){ 
       temp[i] = a[i]; //copy values to new array 
      } //end for 
      delete [] a;  //free old array memory 
      a = temp;  //a points to new array 
     } //end if 

    } // end while 
    cout<<endl; 
    greatest = greatestdivisor(a, n); 
    cout<<"The GCD of: "<<" is: "<<endl; 
    for(int j=0;j<n;j++) 
     cout<<setw(5)<<a[j]<<setw(10)<<greatest<<endl; 
} // end main 


int gcd(int a,int b) 
{ 
    int t; 
    while(a) 
    { 
     t = a; 
     a = b%a; 
     b = t; 
    } 
    return b; 
} 

// gcd finds greatest common divisor of array 
int greatestdivisor(int b[], int size) 
{ 
    int greatest =b[0];// current greatest common divisor, 1 is minimum 

    for (int x=1; x<size; x++) { 
     greatest = gcd(greatest, b[x]); // update greatest common divisor 
    } // end for 
    return greatest; //return gcd 
} // end fuction gcd 
2

您的GCD算法已損壞。它應該從前兩個條目開始,找到數組中每個連續值的GCD。對於數組中的所有條目都重複,最終的gcd在所有這些條目中都是通用的。正如在評論中提到的,你的(破損的)gcd迭代算法的大小也是錯誤的;它應該是嚴格的小於。

一個備受精簡版本是這樣的:

#include <iostream> 
#include <iomanip> 
#include <cmath> 

static int gcd(const int b[], size_t size); 

int main() 
{ 
    int* a = nullptr, value=0; 
    size_t n = 0; 

    std::cout<<"Input numbers:\n"; 
    while(std::cin >> value) 
    { 
     int *temp = new int[n+1]; 
     std::copy(a, a+n, temp); 
     delete [] a; 
     a = temp; 
     a[n++] = value; 
    } 

    std::cout<<"The GCD is " << gcd(a, n) << '\n'; 
    delete [] a; 
} 

static int gcd(const int b[], size_t size) 
{ 
    int res = (size > 0 ? std::abs(b[0]) : 0); 
    for (size_t x=1; x<size; ++x) 
    { 
     int n = std::abs(b[x]); 
     while (n > 0) 
     { 
      auto tmp = res; 
      res = n; 
      n = tmp % n; 
     } 
    } 
    return res; 
} 

輸出

Input numbers: 
10 
100 
40 
x 
The GCD is 10 

使世界更美好:std::vector

現在你可以看到一個手動管理的動態數組是如何工作的,但我不能強調這可以簡化多少,這可以通過而不是來完成,而是簡單地使用標準庫中的預設功能。 std::vectorstd::istream_iterator將對此任務做出簡短的工作,並且代碼變得非常不容易出錯。您可以從std::vector獲得動態內存管理,並使用std::istream_iterator將格式化的輸入複製到EOF或非int數據。總之,幾乎所有的數據管理方式都是爲您處理的。

請看:

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <iomanip> 
#include <cmath> 

static int gcd(const int b[], size_t size); 

int main() 
{ 
    std::cout<<"Input numbers:\n"; 
    std::vector<int> a((std::istream_iterator<int>(std::cin)), 
         std::istream_iterator<int>()); 
    std::cout<<"The GCD is " << gcd(a.data(), a.size()) << '\n'; 
} 

static int gcd(const int b[], size_t size) 
{ 
    int res = (size > 0 ? std::abs(b[0]) : 0); 
    for (size_t x=1; x<size; ++x) 
    { 
     int n = std::abs(b[x]); 
     while (n > 0) 
     { 
      auto tmp = res; 
      res = n; 
      n = tmp % n; 
     } 
    } 
    return res; 
} 

輸出是和以前一樣。祝您好運

+0

這很好 - 我不知道istream迭代器。 +1 – chrisb2244 2014-11-01 07:45:05

1

如果問題完全按照您所描述的方式指定,那麼看起來array並不是明確需要的。

因此,您可以簡化到像

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

int greatestdivisor(std::vector<int> &ints); 
int euclid(int a, int b); 

int main() 
{ 
    std::vector<int> listOfInts; 
    std::string line = "default"; 
    int tempInt=0; 

    std::cout << "Description" << std::endl; 

    while (line.length() != 0) 
    { 
     std::getline(std::cin, line); 
     std::stringstream temp(line); 
    temp >> tempInt; 
    listOfInts.push_back(tempInt); 
    } 
    listOfInts.pop_back(); // Remove the last entry, which is counted twice by this while loop :/ 

    for (int i=0; i< listOfInts.size(); i++) 
    { 
     std::cout<< listOfInts[i] << std::endl; 
    } 

    int gcd = greatestdivisor(listOfInts); 
    std::cout << "gcd = " << gcd << std::endl; 
} 

int greatestdivisor(std::vector<int> &ints) 
{ 
    int currentGCD = ints[0]; 
    while (ints.size() > 0) 
    { 
    int a = ints.back(); 
    ints.pop_back(); 
    currentGCD = euclid(a, currentGCD); 
    std::cout << "currentGCD = " << currentGCD << std::endl; 
    } 
    return currentGCD; 
} 

int euclid(int a, int b) 
{ 
    if (b == 0) 
    return a; 
    else 
    return euclid(b, a % b); 
}