POj 1580(字符串处理)

来源:互联网 发布:知否什么时候上映 湖南 编辑:程序博客网 时间:2024/06/07 03:24

题意:比较两个字符串,位置相同的记录,可以移动比较求最大的位置相同数。样例给的很明确。

最开始只从一边移动比较,后来发现AAAB,BAAA样例,才明白。

刚开始开了四个字符串组:

#include<stdio.h>#include<string.h>int main(){    char a[100],b[100],c[100],d[100];    while(scanf("%s",a) != EOF)    {        if(strcmp(a,"-1") == 0)            break;        else            scanf("%s",b);        if(strlen(a) < strlen(b))        {            strcpy(c,b);            strcpy(d,a);        }        else        {            strcpy(c,a);            strcpy(d,b);        }        int lentha = strlen(c);        int lenthb = strlen(d);        int same = 0,s = 0;        for(int i = 0;i < lentha; i++)        {            s = 0;            for(int j = 0;j < lenthb && c[j+i] != '\0'; j++)                if(c[j + i] == d[j]) s++;            if(s > same)                same = s;        }        for(int i = 0;i < lenthb; i++)        {            s = 0;            for(int j = 0;j < lentha && d[j+i] != '\0'; j++)                if(d[j + i] == c[j]) s++;            if(s > same)                same = s;        }        if(same == 0)            printf("appx(%s,%s) = 0\n",a,b);        else if(same*2 == lentha + lenthb)            printf("appx(%s,%s) = 1\n",a,b);        else        {            int yueshu = 1;            same *= 2;            int sum = lentha + lenthb;            for(int i = 2;i <= same; i++)            {                if(sum%i == 0 && same%i == 0)                    yueshu = i;            }            printf("appx(%s,%s) = %d/%d\n",a,b,same/yueshu,sum/yueshu);        }    }    return 0;}
可以简化:

#include<stdio.h>#include<string.h>int main(){    char a[100],b[100];    while(scanf("%s",a) != EOF)    {        if(strcmp(a,"-1") == 0)            break;        else            scanf("%s",b);        int lentha = strlen(a);        int lenthb = strlen(b);        int same = 0,s = 0;        for(int i = 0;i < lentha; i++)          //需要两次不同方向的遍历,第一次        {            s = 0;            for(int j = 0;j < lenthb && a[j+i] != '\0'; j++)                if(a[j + i] == b[j]) s++;            if(s > same)                same = s;        }        for(int i = 0;i < lenthb; i++)          //第二次        {            s = 0;            for(int j = 0;j < lentha && b[j+i] != '\0'; j++)                if(b[j + i] == a[j]) s++;            if(s > same)                same = s;        }        if(same == 0)            printf("appx(%s,%s) = 0\n",a,b);        else if(same*2 == lentha + lenthb)            printf("appx(%s,%s) = 1\n",a,b);        else        {            int yueshu = 1;            same *= 2;            int sum = lentha + lenthb;            for(int i = 2;i <= same; i++)           //求公约数            {                if(sum%i == 0 && same%i == 0)                    yueshu = i;            }            printf("appx(%s,%s) = %d/%d\n",a,b,same/yueshu,sum/yueshu);        }    }    return 0;}


0 0
原创粉丝点击