字符串的最大公因子C语言实现

  • 力扣题目链接
  • 题目:
    对于字符串 s 和 t,只有在 s = t + t + t + … + t + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
    给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。

枚举实现

/*辗转相除得到最大公约数*/
int gcd(int a,int b)
{
    int t = 0;
    while(b!=0)
    {
        t = a%b;
        a = b;
        b = t;
    }
    return a;
}
/*判断字符串s能否被t整除*/
int check(char* t, char* s, int t_len) 
{
    while (*s != '\0')
    {
        for (int i = 0; i < t_len; i++) 
        {
            if (*t != *s) 
                return 0;
            t++;
            s++;
        }
        t -= t_len; // 重置 t
    }
    return 1;
}
char* gcdOfStrings(char* str1, char* str2)
{
    /*如果str1和str2存在最长字符串x,
    则x的长度必然不超过str1的长度和str2的长度 的 最大公因数
    并且其长度可以被str1的长度和str2的长度整除*/

    /*判断str1和str2的长度,并求其最大公因数*/
    int len_str1 = strlen(str1);
    int len_str2 = strlen(str2);
    int gcd_num = gcd(len_str1,len_str2);

    /*从最大公约数开始枚举,因为求的是最长*/
    for(;gcd_num>=1;gcd_num--)
    {
        /*判断最长字符串x的长度是否可以被str1和str2的长度整除*/
        if(len_str1%gcd_num==0 && len_str2%gcd_num==0)
        {   
            /*根据gcd_num的长度分配空间*/
            char *linshi = (char*)malloc(sizeof(char)*(gcd_num+1));
            if(linshi==NULL)
                return NULL; 
            //将str1中长度为gcd_num的数据复制到linshi中
            for(int i=0;i<gcd_num;i++)
            {
                *linshi = *str1;
                linshi++;
                str1++;
            }
            //linshi++;
            *linshi = '\0';
            linshi = linshi - gcd_num;
            str1 = str1 -gcd_num;

            /*判断linshi字符串能否被str1和str2整除*/
            if (check(linshi,str1,gcd_num)&&check(linshi,str2,gcd_num))
                return linshi;
            //如果不能被整除,释放linshi的空间
            free(linshi);
        } 
    }
    return "\0";
}
  • 在辗转相除求最大公因数时,不需要判断两个数的大小。假设两个数字a=12,b=30则运行过程中,t,a,b的数值如下,所以不在需要判断两个数的谁大谁小
t=12,a=12,b=30
t=6,a=30,b=12
t=0,a=12,b=6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值