算法设计——计算两个字符串的匹配程度

版权声明:版权所有,违权必究!!! https://blog.csdn.net/IT_SoftEngineer/article/details/82872617

问题描述

已知两个字符串,计算这两个字符串的匹配程度,如果字符串完全一样则输出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;
}

猜你喜欢

转载自blog.csdn.net/IT_SoftEngineer/article/details/82872617