| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 728 人关注过本帖
标题:C编码转换问题,求高手指导
只看楼主 加入收藏
hwz91
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2010-5-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
C编码转换问题,求高手指导
给定一个仅包含’A’-’Z’的字符串,用下面的方法进行编码
(1)每个包含k个相同字符的子串要表示成”kX”,其中X是由唯一字符组成的子串。(2)如果某个子串的长度为1,则1忽略不写。
输入:第1行输入一个整数N(1<=N<=100) ,代表要处理的字符串的个数。接下来的N行就分别输入一个只包含’A’-’Z’的字符串,每个字符串的长度小于10000.
输出:对于每个字符串,在单独的一行上输出该字符串编码转换后的内容。        

核心是如何判断出新的子串出现,以及计算每个子串中字符的个数。

输入:                        输出
2
MMKXXXXXXFFCA                 2MK6X2FCA
ABBPPPPPTT                    A2B5P2T


思路有点混,求解啦,谢谢
搜索更多相关主题的帖子: 编码 指导 
2010-08-27 08:54
hwz91
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2010-5-24
收藏
得分:0 
这是我自己写的,注释掉的部分逻辑混乱,没能实现所要求的功能,望指导ing

#include <stdio.h>
#include <string.h>
void main()
{
    int m,times,num[385],k,i,len;
    const int n;
    char c[100][10000],copy[27],t;
    puts("Please Input N :");
    scanf("%d",&n);
    puts("Well,input the strings line by line");
    for(times=0;times<n;times++)
    {
        scanf("%s",c[times]);
    }
    for(times=0;times<n;times++)
    {
        len=strlen(c[times]);
        /*
        for(k=0;k<len;k++)
        {
            num[k]=0;
            for(t='A';t<='Z';t++)
            {
                if(c[times][k]==t)
                {
                    num[k]++;
                    break;
                }
            }
        }
        
        for(i=0,k=0;i<len;i++)
        {
            copy[k]=c[times][i];
            if(c[times][i]!=c[times][i+1])
            {
                k++;
            }
        }*/
        for(i=0;i<k;i++)
        {
            printf("%d%c",num[i],c[times][i]);
        }
        printf("\n");
    }
}
2010-08-27 09:29
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:20 
这个问题我觉得有一点可能稍微麻烦一点:
你定义的二位数组太大了,已经超过了C语言中数组的上限,
所以你这种算法肯定不可能正常运行。
尝试一下动态分配内存的方法吧!
2010-08-27 12:37
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
#include <stdio.h>
#include <string.h>

int main()
{
    int tmp,times,num[100],k,i,j,len;
    int n;
    char c[100][100],copy[100];

    puts("Please Input N :");
    scanf("%d%*c",&n);
    puts("Well,input the strings line by line");
    for(times=0;times<n;times++)
    {
        scanf("%s",c[times]);
    }
   
    for(times=0;times<n;times++)
    {
        len=strlen(c[times]);

        i = -1;
        tmp = 0;
        memset(num,0,sizeof(num));                //注意每次都必须初始化
        memset(copy,0,sizeof(copy));                //注意每次都必须初始化
        for(k=0;k<len;k++)
        {  
            if(isupper(c[times][k]))
        {
            if(tmp == c[times][k])
                num[i]++;
            else
            {
                num[++i]++;
                tmp = c[times][k];
                copy[i] =tmp;
            }
        }
        else
            continue;
        }
        
      
        for(j=0;j<=i;j++)
        {
            printf("%d%c",num[j],copy[j]);
        }
        printf("\n");
    }
   
    return 0;
}
给你提供一个不是缩减长度(10000改成了100)的程序,其他要求都满足了。你参考一下吧~
2010-08-27 13:13
hwz91
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2010-5-24
收藏
得分:0 
谢谢erikyo哈,我想清楚了
呵呵,我一开始就把题目意思理解错了,老师讲的和你是一样的

还有个问题,如果输入的是AASSAA的话,按上面程序输出的是2A2S2A,怎么样让它输出,4A2S呢?

我的思路上先找出所有不同的元素,挨个保存,然后统计个数。
这个是我改了的代码,各个元素的个数能统计好,但是找元素的时候不知如何是好,AASSAA成了4A2S2S,我接下来该如何改呢?
#include <stdio.h>
#include <string.h>
void main()
{
    int times,num[385],k,i,len,j;
    const int n;
    char c[100][10000],copy[27];

    puts("Please Input N :");
    scanf("%d",&n);
    puts("Well,input the strings:");
    for(times=0;times<n;times++)
    {
        scanf("%s",c[times]);
    }
   
    for(times=0;times<n;times++)
    {
        
        len=strlen(c[times]);
        
        for(i=0,j=1;i<len;i++)
        {
            copy[0]=c[times][0];
            if(copy[j-1]!=c[times][i+1])
            {
                copy[j]=c[times][i+1];
                j++;
            }
        }

        for(i=0;i<j;i++)
        {
            num[i]=0;
            for(k=0;k<len;k++)
            {
                if(copy[i]==c[times][k])
                    num[i]++;
            }
        }
        for(i=0;i<j;i++)
        {
            if(num[i]>1)
                printf("%d%c",num[i],copy[i]);
            else
                printf("%c",copy[i]);
        }
        
        printf("\n");
    }
}

[ 本帖最后由 hwz91 于 2010-8-28 15:10 编辑 ]
2010-08-28 15:08
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
你如果不计开销的话吗,来一个新的字符,存进一个新的数组,
然后遍历整个输入的字符串,得到出现的次数,存入和字符对应另一个数组就可以了。
2010-08-28 17:00
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
#include <stdio.h>
#include <string.h>

int main()
{
    int times,num[385],k,i,len,j;
    int n;
    char c[100][10000],copy[27];

    puts("Please Input N :");
    scanf("%d",&n);

    puts("Well,input the strings:");
    for(times=0;times<n;times++)
    {
        scanf("%s",c[times]);
    }
  /*
    for(times=0;times<n;times++)
    {
        
        len=strlen(c[times]);
        
        for(i=0,j=1;i<len-1;i++)            //i+1的话就不能用i < len了
        {
            copy[0]=c[times][0];
            if(copy[j-1]!=c[times][i+1])    //这个语句只是可以区分相邻的元素,要是出现ABA这种情况呢?
            {
                copy[j]=c[times][i+1];
                j++;
            }
        }
*/
    for(times = 0; times < n; times++)
    {
        len = strlen(c[times]);
        j = 0;
        copy[0] = c[times][0];

        for(i = 0; i < len - 1; i++)
        {
            for(k = 0; k <= j && copy[k] != c[times][i+1]; k++);

            if(k > j)
            {
                copy[++j] = c[times][i+1];
            }
            
        }

        for(i=0;i<=j;i++)
        {
            num[i]=0;
            for(k=0;k<len;k++)
            {
                if(copy[i]==c[times][k])
                    num[i]++;
            }
        }

        for(i=0;i<=j;i++)
             printf("%d%c",num[i],copy[i]);
               
        printf("\n");
    }
}
2010-08-28 18:44
hwz91
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2010-5-24
收藏
得分:0 
嗯 好了 感谢ing!!
后添上的那个for循环我纠结了好久哈
2010-08-28 19:55
快速回复:C编码转换问题,求高手指导
数据加载中...
 
   



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

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