搜索
查看: 2458|回复: 0
打印 上一主题 下一主题

[题目/题解] [题解]字符串展开(expand)

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-20 21:01:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[题解]字符串展开(expand)
输入数据:
2 3 2
a-d-d-a-9-a-a-b-b-a
输出数据:
aCCCBBBd-d-a-9-a-ab-b-a




[code=Cpp width=740px]#include <stdio.h>
#include <string.h>

int main()
{
    int p1,p2,p3,i,j,k,t,len;
    char a[100];
   
    freopen("expand.in","r",stdin);
    freopen("expand.out","w",stdout);
    scanf("%d %d %d",&p1,&p2,&p3);
    scanf("%s",a);
   
    len=strlen(a);
    for(i=0;i<=len-1;i++)
    {
        //首先是否判断当前这个字符 是否 '-' 号 ,如果不是'-'号,肯定是要输出,
        //如果是'-',则需要分情况讨论
        if(a=='-')
        {
            //首先判断'-'号的左右两边 是不是 同为 字母或者数字  
            //如果不同为字母或者数字,减号是要留下的
            //如果同为为字母或者数字,继续进行分情况讨论
            if(a[i-1]>='a' && a[i-1]<='z' && a[i+1]>='a' && a[i+1]<='z' ||  a[i-1]>='0' && a[i-1]<='9' && a[i+1]>='0' && a[i+1]<='9')
            {
                //如果'-'号 左右两边是否相等,相等的话,'-'号需要留下。
                if(a[i-1]==a[i+1])
                {
                    printf("-");
                }
                else if(a[i-1]+1==a[i+1])//如果'-'号 右边是左边的后继,'-'号不能输出。
                {
                    ;//为空语句,什么都不做
                }
                else
                {
                    if(a[i-1]>a[i+1])//如果'-'号 左边>左边,直接输出 '-'号
                    {
                        printf("-");
                    }
                    else//如果'-'号 右边>左边,且不是左边的后继,在进行讨论
                    {
                        //大小写判断
                        t=0;
                        if(p1==2)
                            t=32;
                        //是否逆序
                        if(p3==1)//正序
                        {
                            for(j=a[i-1]+1;j<=a[i+1]-1;j++)//补充中间的
                            {
                                for(k=1;k<=p2;k++)//每个打印P2次
                                {
                                    if(p1==3)//星号判断
                                        printf("*");
                                    else
                                    {
                                        //对于数字的特殊处理,注意这里很重要,因为如果是数字,即使p1=2,也不能打印大写字母,所以不能减32
                                        if(j>='0' && j<='9')
                                          printf("%c",j);
                                        else
                                          printf("%c",j-t);
                                    }
                                }
                            }
                        }
                        else//逆序
                        {
                            for(j=a[i+1]-1 ;j>=a[i-1]+1;j--)//补充中间的
                            {
                                for(k=1;k<=p2;k++)//每个打印P2次
                                {
                                    if(p1==3)//星号判断
                                        printf("*");
                                    else
                                    {
                                        //对于数字的特殊处理,注意这里很重要,因为如果是数字,即使p1=2,也不能打印大写字母,所以不能减32
                                        if(j>='0' && j<='9')
                                          printf("%c",j);
                                        else
                                          printf("%c",j-t);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else//如果不同为字母或者数字,减号是要留下的
            {
                printf("-");
            }
        }
        else
        {
            printf("%c",a);
        }
    }
    getchar();getchar();
    return 0;
}
</string.h></stdio.h>[/code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表