| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2749 人关注过本帖, 1 人收藏
标题:一道C语言题
只看楼主 加入收藏
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:4 
是不是这样:每次从S取M*L长度子串,再拆分M段L长度子串,比对M段子串相同位置的字符是否相同,没有相同时为所求。
子串截取和分段都易明,主要是字符比对,就看能否做到比对次数更少。
2016-12-18 07:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
无妙计,常理出牌测试了一下,不知有无理解错。
#include <stdio.h>

int _issub(char *p, int M, int L)
{
    int i, j, k;

printf("\n");
for (i=0; i<=(M-1)*L; i+=L)
    printf("%.*s ", L, p+i);
printf("\n");

    for (i=0; i<=(M-2)*L; i+=L)
        for (j=i+L; j<=(M-1)*L; j+=L)
            for (k=0; k<L; k++)
            {
            
printf("%c %c\n", p[i+k], p[j+k]);

                if (p[i+k] == p[j+k])
                    return 0;
            }
    return 1;
}

main()
{
    char S[]="abccabbac";
    int M=2, L=3;
    //int M=3, L=2;
    int i, len;
    printf("S: %s\nM: %d\nL: %d\n", S, M, L);
    for (len=0; S[len]; len++);
    for (i=0; i<=len-M*L; i++)
    {
        if (_issub(S+i, M, L))
        {
            printf("可回收 %.*s\n", M*L, S+i);
            printf("\n");
        }
    }
}



[此贴子已经被作者于2016-12-18 10:16编辑过]

2016-12-18 09:48
小李探花
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 18楼 九转星河
这个我测试了一下,没法求出所有的可回收字串,按照我之前那张截图测试的,L和M分别输入了2和3,然后输入了abccabbac,只求出了一个可回收字串“abccab”
2016-12-18 11:34
小李探花
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 22楼 吹水佬
对的,就是这样理解的。能试着敲出来么,手头题目太多了,已连续敲了几天的代码,累瘫
2016-12-18 11:40
小李探花
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 20楼 九转星河
还不行,这道题目好像要把你输入的图书按照出版年月的先后顺序排序,比如一本书1998年6月出版,一本书2000年9月出版,输出后1998年6月的要排在2000年9月的前面,当然,正序和倒序都行
2016-12-18 11:47
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:4 
完成题主这题应该不复杂,简单完成代码如下,请测试:
程序代码:
#include <stdio.h>

void main()
{
    char a,s[100];
    int i,j,k,m,l;
    printf("请输入字符串S:");
    gets(s);
    printf("请输入M和L:");
    scanf("%d%d",&m,&l);
    for(i=0;s[i+m*l];i++)
    {
        for(j=0;j<l;j++)
        {
            a=s[i+j];
            for(k=1;k<m;k++)if(a==s[i+j+k*l])break;;
            if(k<m)break;
        }
        if(j==l)
        {
            printf("满足条件的字符串:");
            for(k=0;k<m*l;k++)printf("%c",s[i+k]);
            printf("\n");
        }
    }
}
2016-12-18 12:54
小李探花
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 26楼 xzlxzlxzl
兄台厉害了,仅仅二十多行的代码就差不多解决了这道题,不过我测试了一下还有点问题,有时候还是无法计算出全部的可回收字串。
图片附件: 游客没有浏览图片的权限,请 登录注册


如图所示我输入了“abcdefghi”,应当有四个可回收字串,漏了“defghi”
2016-12-18 14:09
小李探花
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 26楼 xzlxzlxzl
兄台能再修改一下么,然后适当注释一下
2016-12-18 14:11
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
将语句“for(i=0;s[i+m*l];i++)”修改为“for(i=0;s[i+m*l-1];i++)”即可。
2016-12-18 15:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 25楼 小李探花
感觉最近编程开始跟不上了,还要请众神鼎力相助才行,我弄一个完整版的代码~也许要我四五个小时甚至更长的时间,关于回收字符串那题,我昨晚深夜做的,做得比较草率,同样排序那题也是,涉及到二级甚至是三级排序,在一级排序的基础上还要再摆弄一下才行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-18 15:55
快速回复:一道C语言题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058200 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved