3.12 杭电复试题2014

 1.如果您曾经尝试在 Macintosh 上阅读 html 文档,您就知道如果没有安装网 景,那是多么困难。

  现在,谁能忘记安装 HTML 浏览器呢?这很简单,因为大多数时候你在 MAC 电脑上不需要一个,因为有一个以 MAC 为母语的杂耍阅读器,但是如果你需要一 个,你会怎么做?

  您的任务是编写一个小型的 html 浏览器。它只需要显示输入文件的内容,只 知道 html 命令(标记)< br >,这是一个 linebreak 和< hr >,它是一个水平标 尺。然后,您应该将所有制表符、空格和换行符视为一个空格,并在一行中显示 不超过 80 个字符的结果文本。

  输入

  输入由应该显示的文本组成。该文本由一个或多个空格、制表符或换行符分 隔的单词和 HTML 标记组成。 单词是字母、数字和标点符号的序列。例如,“abc,123”是一个词,但是 “abc,123”是两个单词,即“abc”和“123”。一个单词总是少于 81 个字符, 并且不包含任何' < '或' > '。所有 HTML 标签都是< br >或< hr >。

  输出

  您应该使用以下规则显示所产生的文本: 如果你在输入中读了一个字,结果线的长度不会超过 80 个字符,打印出来, 然后在新的一行上打印出来。 如果您在输入中读取< br >,那么就开始一个新行。 如果您在输入中读取< hr >,那么就开始一条新行,除非您已经在一行的开 头,显示 80 个字符“-”并开始一个新行(再次)。 最后一行以换行符结束。(编写一个浏览器输入输出------对应杭电 oj 第 1088 题) 

(题目是以上这些,因为看不太懂题目,就把hduoj1088的输入输出的样例搬过来了)

Sample Input

Hallo, dies ist eine

ziemlich lange Zeile, die in Html

aber nicht umgebrochen wird.

<br>

Zwei <br> <br> produzieren zwei Newlines.

Es gibt auch noch das tag <hr> was einen Trenner darstellt.

Zwei <hr> <hr> produzieren zwei Horizontal Rulers.

Achtung              mehrere Leerzeichen irritieren

Html genauso wenig wie

 

mehrere Leerzeilen.

Sample Output

Hallo, dies ist eine ziemlich lange Zeile, die in Html aber nicht umgebrochen

wird.

Zwei

 

produzieren zwei Newlines. Es gibt auch noch das tag

--------------------------------------------------------------------------------

was einen Trenner darstellt. Zwei

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

produzieren zwei Horizontal Rulers. Achtung mehrere Leerzeichen irritieren Html

genauso wenig wie mehrere Leerzeilen.

#include<stdio.h>
#include<string.h>
char c[1000];
int i,n,l;
void main()
{
    n=0;
    while(scanf("%s",&c)!=EOF)
    {
        l=strlen(c);
        if(!strcmp(c,"<br>"))
        {
            printf("\n");
            n=0;
        }
        else if(!strcmp(c,"<hr>"))
        {
            if(n!=0)
                printf("\n");
            printf("--------------------------------------------------------------------------------\n");
            n=0;
        }
        else
        {
            if(n+l<80)
            {
                if(n!=0)
                {
                    printf(" ");
                    n++;
                }
                printf("%s",c);
                n+=l;
            }
            else
            {
                printf("\n");
                n=l;
                printf("%s",c);
            }
        }
        memset(c,'\0',sizeof(c));
    }
    printf("\n");
}

看来例子以后,总结出来要遵守的规则大概如下:

1.遇到<br>要换行。

2.遇到<hr>不但要换行,还要输出80个‘-’,并换行。

3.一行的字符超过80个以后也要换行。(如果一个单词输出以后本行多于80个字符,那该单词也要到下一行输出)

4.多个空格只能输出一个空格

一开始我用的gets(),后来因为空格处理太麻烦,看来讨论区发现有个大神用的scanf,直接忽略空格,会比gets方便很多。

注意一篇文本输入输出完毕以后,还要有个换行。

 

2.给定一个仅包含“a”-“Z”的字符串,我们可以使用以下方法对其进行编码:

1.每个包含 k 个字符的子字符串应该被编码到“kX”,其中“X”是这个子字符串中唯一的字符。

2.如果子字符串的长度为 1,则“1”应被忽略。 输入 第一行包含一个整数 N(1 <= N <= 100),表示测试用例的数量。下一个 N 行 包含 N 个字符串。每个字符串只包含“A”-“Z”,长度小于 10000。 输出 对于每个测试用例,将编码的字符串输出到一行中。 (对应hduoj1020题)

Sample Input

2

ABC

ABBCCC

Sample Output

ABC

A2B3C

#include<stdio.h>
#include<string.h>
char c[100000];
int i,n,l,num;
void main()
{
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            scanf("%s",&c);
            getchar();
            l=strlen(c);
            char s=c[0];
            num=1;
            for(i=1;i<l;i++)
            {
                if(s==c[i])
                    num++;
                else
                {
                    if(num!=1)
                        printf("%d%c",num,s);
                    else
                        printf("%c",s);
                    num=1;
                    s=c[i];
                }
            }
            if(num!=1)
                printf("%d%c\n",num,s);
            else
                printf("%c\n",s);
            memset(c,'\0',sizeof(c));
        }
    }
}

奇怪的很,一开始我用gets就超时,用scanf就不超时了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值