實驗一演算法描述及其程式實現

2puT發表於2016-09-10


(驗證型實驗2學時)

.實驗目的

1鞏固程式設計語言基礎知識,熟悉檔案操作等。

2對給定問題,能設計演算法並程式設計實現問題的求解。


.實驗要求

1認真填寫實驗報告,附加原始碼(主要程式碼)和執行記錄;

2對設計好的演算法,測試執行實驗資料,檢查輸出是否正確。

.實驗內容:

問題1.Euclid演算法求兩個非負整數mn的最大公因數GCD(m,n)和最小公倍數。

1)用流程圖描述Euclid演算法

(2)用虛擬碼描述Euclid演算法:

//使用Euclid演算法求GCD(m,n)

//輸入:兩個不全為0的非負整數m,n//輸出:GCD(m,n)while n¹0,dor¬mmod nm¬nn¬rreturn m

(3)程式設計實現此演算法.

#include <iostream>
using namespace std;
//Greatest common factor 
int gcd(int m, int n)
{
    int t;
    if(m < n)
    {	
	t = m;
	m = n;
	n = t;
    }
    while(n != 0)
    {
	t = m % n;
	m = n;
	n = t;
    }
    return m;
}

//Least common multiple 
int lcm(int m, int n)
{
    return m * n / gcd(m,n);
}

int main()
{
    int m , n;
    cout << "\tplease input m: ";
    cin >> m;
    cout << "\tplease input n: ";
    cin >> n;
    cout << "\tgcd= ";
    cout << gcd(m,n) << endl;
    cout << "\tlcm= ";
    cout << lcm(m,n) << endl;
    return 0;
}






問題2.使用連續檢測演算法求兩個非負整數mn的大公因數GCD(m,n)

1用流程圖描述描述連續檢測演算法:

2)用虛擬碼描述連續檢測演算法:

//使用連續檢測演算法求GCD(m,n)

//輸入:兩個不全為0的非負整數m,n

//輸出:GCD(m,n)


t¬min(m,n)

while t>1, do

if m|t do

ifn|t

return t

t¬t-1

return 1

(3)程式設計實現此演算法。

#include <iostream>
using namespace std;

//judge 'm','n'
int min(int m, int n)
{
    return (m <= n ? m : n);
}

//gcd Greatest common factor 
int gcd(int m, int n)
{
    int t;
    t = min(m,n);
    while(t > 1)
    {
	if(m % t == 0 && n % t == 0)
	    return t;
	t--;
    }
}

int main()
{
    int m, n;
    cout << "\tplease input m= ";
    cin >> m;
    cout << "\tplease input n= ";
    cin >> n;
    cout << "\tgcd= " << gcd(m,n) << endl;
    return 0;
}





問題3.在一個n元陣列中按順序查詢是否包含元素K


(1)設計解決此問題的演算法,並用虛擬碼描述;

(2)程式設計實現此演算法。


#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    string a;
    char K;
    int n=0;
    cout << "\tinput n\t";
    cin >> n;   // <100
    cout << "\tinput K\t";
    cin >> K;

    //input a[]
    int i = 0;
    cout << "\tinput a[]\t";
    cin >> a;

    //find K
    for (int i=0; i < n; i++)
    {
	if (K == a[i])
	  {
	      cout << "\tcontains 'K'" << endl;
	    break;
	  }
	else if(i == n-1)
	    cout << "\tNO contains 'K'" << endl;
    }
  
    return 0;
}



問題4.在一個n元陣列中查詢元素最大值。

(1)設計解決此問題的演算法,並用虛擬碼描述;

(2)程式設計實現此演算法。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> ivec;
    int tmp, max; //input 'tmp', max

    cout << "\tplease input vector 'ivec':\n";
    while(cin >> tmp){ //input number the end of the "Ctel + D"
        ivec.push_back(tmp);
    }

    for(int i = 1; i < ivec.size(); ++i){
	if(ivec[0] < ivec[i])
	    //int t = ivec[0]; //save
	    ivec[0] = ivec[i];
	    //ivec[i] = t;
    }

    cout << "\t max= " << ivec[0] << endl;

    return 0;  
}




問題5.在一個n元陣列中驗證元素是否互不相同。

(1)設計解決此問題的演算法,並用虛擬碼描述;

(2)程式設計實現此演算法。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> ivec;
    int tmp; 

    cout << "\tplease input vector 'ivec':\n";
    while(cin >> tmp){ //input number the end of the "Ctel + D"
        ivec.push_back(tmp);
    }

    
    cout << "\tIs different, then don't output; " <<endl;
    cout << "\tThere are the same, the output " <<endl;
    for(int i = 0; i < ivec.size(); ++i){
	for(int j = i + 1; j < ivec.size(); ++j){
	    if(ivec[i] == ivec[j]){
		cout << "\t\tHave the same" << endl;
		break;
	    }
	}	    
    }

    return 0;  
}


相關文章