poj 1580 String Matching【gcd輾轉相除法】
開始想用類似“錯車”的思路去解決,但是發現不是太好著手,還是選用首字母定位的方法去解決的
題意:現定義兩個僅由大寫字母組成的字符串的匹配程度如下:將某一字符串的首字符與另一字符串的某一字符對齊,然後後麵的字符也一一對齊,直至某一字符串的串尾為止。對於每一組對齊的兩個字符,若這兩個字符相等,則計數。最後計算這個計數的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; }
最後更新:2017-04-03 12:56:21