python3刷TK题库 1008: ASCII码 (python3读取多行输入,python3在同一行输出)
这个题目本身好像是有问题的。我按照它的描述编程,结果一直不过。后来在网上找了别人通过的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 Sequence | Meaning |
---|---|
\newline | Backslash and newline ignored |
\ | Backslash () |
' | Single quote (') |
" | Double quote (") |
\a | ASCII Bell (BEL) |
\b | ASCII Backspace (BS) |
\f | ASCII Formfeed (FF) |
\n | ASCII Linefeed (LF) |
\r | ASCII Carriage Return (CR) |
\t | ASCII Horizontal Tab (TAB) |
\v | ASCII Vertical Tab (VT) |
\ooo | Character with octal value |
\xhh | Character 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
参考资料: