python3刷TK题库 1008: ASCII码 (python3读取多行输入,python3在同一行输出)

in #acm7 years ago (edited)

这个题目本身好像是有问题的。我按照它的描述编程,结果一直不过。后来在网上找了别人通过的C和C++代码,发现能通过的输出其实是另一种不同的格式。于是,我又把我的python3程序按照这个新的输出格式写,结果就通过了。这说明题目自己的描述是有问题的!

不过,为了通过这个题目,我学了不少python3的输入和输出控制,也算是有不小的收获。

python3 如何读取多行输入?

如前面所述,python3只有input()一种读取输入的函数,远不如C/C++灵活。inpupt()读取输入的限制在于,它只能读取一行,并且是一下子读一行。不能像C/C++一样,读取单个输入。这就给,多行输入和需要控制输入的数量的场合带来麻烦。网上有一些解决办法,我采用的是:

遇到多行输入,先用input读取每行的输入,存入数组,然后使用join方法,把他们连成一个大的字符串。

lines = []
while True:
    line = input()
    if line:
        lines.append(line)
    else:
        break
text = ' '.join(lines)

其中,text=' '.join(lines)表示连接数组元素的时候,每个元素间隔为一个空格。这个也可以改为其他字符,如 text='-'.join(lines)表示用"-"连接。

另外对输入的数量可用:
current_number_of_input=len(line.split)
来算出,当前line可以被分割成多少个输入。

把输出控制在同一行:

python3的print函数的原型为:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

这里面可以看出,因为默认end='\n'所以print()的输出一般来说都要自动换行。而有的场合不适合输出自动换行,因此只要改变end的默认值就行了:你写清end=''就可以了。

        print('%c' % chr(int(char[i])),end='')

python3 支持的转义字符

(原表见官方文档:https://docs.python.org/3.6/reference/lexical_analysis.html )

Escape SequenceMeaning
\newlineBackslash and newline ignored
\Backslash ()
'Single quote (')
"Double quote (")
\aASCII Bell (BEL)
\bASCII Backspace (BS)
\fASCII Formfeed (FF)
\nASCII Linefeed (LF)
\rASCII Carriage Return (CR)
\tASCII Horizontal Tab (TAB)
\vASCII Vertical Tab (VT)
\oooCharacter with octal value
\xhhCharacter with hex value

这次的题目是:

http://tk.hustoj.com/problem.php?id=1008

1008: ASCII码
时间限制: 1 Sec 内存限制: 32 MB
提交: 5669 解决: 3304
[提交][状态][讨论版][命题人:外部导入][下载1元][20kb]
题目描述
相信大家一定都知道大名鼎鼎的ASCII码,这次给你的任务是输入数字(表示ASCII码),输出相对应的字符信息。
输入
第一行为一个整数T(1<=T<=1000)。
接下来包括T个正整数,由空白符分割。(空白符包括空格、换行、制表符)
这些整数不会小于32。
输出
在一行内输出相应的字符信息。(注意不要输出任何多余的字符)
样例输入
13
72 101 108 108 111 44
32 119 111 114 108 100 33
样例输出
Hello, world!

原本看题目,以为是所有的13个数字都输入之后,处理完制表符,空格,换行之后,再显示对应的字符串。所以,就需要python读取可能的多行输入,再输出到同一行。

然后一直不通过,所以看了一下别人通过的C和C++程序,才发现,原来是一次换行,就显示一下已有的输入对应的ASCII码,比如:

http://www.voidcn.com/article/p-rxdyqkuo-yq.html

#include <iostream>

using namespace std;

int main()
{
   int n,a;
   cin>>n;
   while(n--)
   {
       cin>>a;
      cout<<char(a);
        if(!n)
        cout<<endl;
   }
   return 0;
}

http://blog.csdn.net/sinat_37765046/article/details/72827961

#include<stdio.h>  
main()  
{  
    int t;  
    int i;  
    int a[10000];  
    scanf("%d",&t);  
    for(i=0;i<t;i++)  
    {  
        scanf("%d",&a[i]);  
    }  
    for(i=0;i<t;i++)  
    {  
        printf("%c",a[i]);  
    }  
    printf("\n");  
}  

所以,我也修改成这样的输出方式,我的python3程序:

i=0
counter=0
std_in=[]
number_of_input_char=int(input())

while (number_of_input_char-counter):
    line = input()
    char=line.split()
    i=len(char)
    counter=counter+i
    a=0
    while (a-i<0):
        print('%c' % chr(int(char[a])),end='')
        a=a+1

再附一个按照它题目叙述的输出方式写的python3,这个是不能AC的,但是是忠于题目原意的:

number_of_input_char=int(input())
    
lines = []
while True:
    line = input()
    if line:
        lines.append(line)
    else:
        break
text = ' '.join(lines)

char=text.split()

for i in range(0, number_of_input_char):
    if (int(char[i]) >= 32):
        print('%c' % chr(int(char[i])),end='')
    else:
        break

参考资料:

  1. https://stackoverflow.com/questions/30239092/how-to-get-multiline-input-from-user
  2. https://stackoverflow.com/questions/3249524/print-in-one-line-dynamically
  3. https://docs.python.org/3.6/reference/lexical_analysis.html