开始想用类似“错车”的思路去解决,但是发现不是太好着手,还是选用首字母定位的方法去解决的
题意:现定义两个仅由大写字母组成的字符串的匹配程度如下:将某一字符串的首字符与另一字符串的某一字符对齐,然后后面的字符也一一对齐,直至某一字符串的串尾为止。对于每一组对齐的两个字符,若这两个字符相等,则计数。最后计算这个计数的2倍,与两串总长度的最大比值。
如果说这题最大的收获就是,两种方法的辗转相除法求gcd
AC的代码:
#include <stdio.h>
#include <string.h>/*//辗转相除法的递归写法
int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
}
*/int gcd(int a, int b)
{//辗转相除法while (b%a){int t=a;a=b%a;b=t;}return a;
}void appx(char * wo1,char * wo2)
{if(!strcmp(wo1,wo2)){printf("appx(%s,%s) = 1\n",wo1,wo2);return;}//值已经传进来了int len1=strlen(wo1),len2=strlen(wo2);int count=0;int i,j,max,common=0;//枚举word1和word2的首字母for(i=0;i<len1;i++){for(j=0;j<len2;j++){max=0;for (int i1=i,j1=j;i1<len1 && j1<len2;++i1,++j1)if (wo1[i1]==wo2[j1]) ++max;if (common<max) common=max;}}if(common==0){printf("appx(%s,%s) = 0\n",wo1,wo2);return;}int molecular=common*2;//分子int denominator=len1+len2;//分母int g=gcd(molecular,denominator);printf("appx(%s,%s) = %d/%d\n",wo1,wo2,molecular/g,denominator/g);
}int main()
{char word1[105],word2[105];while(scanf("%s",word1)){if(!strcmp(word1,"-1"))return 0;scanf("%s",word2);appx(word1,word2);}return 0;
}