演算法設計——計算兩個字串的匹配程度
阿新 • • 發佈:2018-11-30
問題描述
已知兩個字串,計算這兩個字串的匹配程度,如果字串完全一樣則輸出1,如果字串沒有一個字母相同則輸出0,否則利用公式:(max + max) / (len1+len2)計算匹配程度,其中max表示兩個字串對齊時最多可能對應相同的字母的個數,len分別表示這兩個字串的長度
實現過程
- 求解最大公約數的函式實現
- 開闢指標動態儲存空間以實現從鍵盤上輸入字元並存在陣列中
- 實現運算行數與輸入程式碼的對應,並保證運算的行數為0時系統直接退出
- 實現兩個字元的比較
- 判斷字串比較的三種結果:0,1,其他
- 使用公式輸出字串比較的結果,並用函式實現分式的化簡
程式碼實現
#include<iostream> using namespace std; int GCD(int a, int b) { if (b == 0) return a; else return GCD(b, a%b); } int main() { int n,i; /*c++中要使用指標並開闢動態儲存空間來從鍵盤中輸入陣列,如果直接用字元則必須賦初值,若初值賦值不完全則會顯示燙來預設初值*/ char *a = new char [300]; char *b = new char [300]; int len1, len2, lenSum; /*來確定要輸入的行數,並保證輸入行數為0時程式能夠自動退出*/ while (cin>>n && n>0) { for (i = 0; i < n; i++) { cin >> a >> b; len1 = strlen(a); len2 = strlen(b); lenSum = len1 + len2; int max = 0, num, i, j, k; for (k = len1 - 1; k > 0; k--) { num = 0; i = k; j = 0; while (1) { if (a[i++] == b[j++]) num++; if (a[i] == '\0' || b[j] == '\0') break; } if (num > max) max = num; } for (k = 0; k <= len2 - 1; k++) { num = 0; i = 0; j = k; while (1) { if (a[i++] == b[j++]) num++; if (a[i] == '\0' || b[j] == '\0') break; } if (num > max) max = num; } max = max * 2; if (max == 0) cout << "appx(" << a << "," << b << ")" << "=" << "0" << endl; else if (max == lenSum) cout << "appx(" << a << "," << b << ")" << "=" << "1" << endl; else { int divisor = GCD(max, lenSum); /*使用最大公約數來輸出最簡式*/ cout << "appx(" << a << "," << b << ")" << "=" << max / divisor << "/" << lenSum / divisor << endl; } } /*保證輸入指定行數後程序自動關閉*/ if (i == n) break; } return 0; }