1. 程式人生 > >演算法設計——計算兩個字串的匹配程度

演算法設計——計算兩個字串的匹配程度

問題描述

已知兩個字串,計算這兩個字串的匹配程度,如果字串完全一樣則輸出1,如果字串沒有一個字母相同則輸出0,否則利用公式:(max + max) / (len1+len2)計算匹配程度,其中max表示兩個字串對齊時最多可能對應相同的字母的個數,len分別表示這兩個字串的長度

實現過程

  1. 求解最大公約數的函式實現
  2. 開闢指標動態儲存空間以實現從鍵盤上輸入字元並存在陣列中
  3. 實現運算行數與輸入程式碼的對應,並保證運算的行數為0時系統直接退出
  4. 實現兩個字元的比較
  5. 判斷字串比較的三種結果:0,1,其他
  6. 使用公式輸出字串比較的結果,並用函式實現分式的化簡

程式碼實現

#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;
}