杭电acm1306
http://acm.hdu.edu.cn/showproblem.php?pid=1306
这题就是通过两个字符串的依次移动,然后求出对应字符相等的最大的那个数,题目中的例子可以较清楚的理解,在输出的地方注意,当这个数为0时直接输出0而非分数,当然这个数的两倍和两字符串长度和相等时,输出的也是1而不是分数,然后如果输出的一定得是分数时,先用辗转相除法求出最大公约数,再将之转化为两个互质的分子和分母,这题感觉很悲剧,居然暴力的代码也能0ms过
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> int huzhi(int a,int b) { int r=a%b; while(r) { a=b; b=r; r=a%b; } return b; } int main() { int sum,max,i,j,t,h; char s1[1000],s2[1000]; while(scanf("%s %s",s1,s2),strcmp("-1",s1)) { max=0; for(i=0;s1[i]!='\0';i++) { sum=0; t=i; for(j=0;s2[j]!='\0';j++,t++) if(s1[t]==s2[j]) sum++; if(sum>max) max=sum; } for(i=0;s2[i]!='\0';i++) { sum=0; t=i; for(j=0;s1[j]!='\0';j++,t++) if(s2[t]==s1[j]) sum++; if(sum>max) max=sum; } max*=2; if(max==0) { printf("appx(%s,%s) = %d\n",s1,s2,max); continue; } else if(max==(strlen(s1)+strlen(s2))) { printf("appx(%s,%s) = 1\n",s1,s2); continue; } h=huzhi(strlen(s2)+strlen(s1),max); printf("appx(%s,%s) = %d/%d\n",s1,s2,max/h,(strlen(s1)+strlen(s2))/h); } return 0; }