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