例1:(信息奥赛一本通:1003)对齐输出
题目描述
读入三个整数,按每个整数占 8 8 8 个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。
输入格式
只有一行,包含三个整数 a , b , c a,b,c a,b,c。整数之间以一个空格分开。
输出格式
只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。
样例 #1
样例输入 #1
123456789 0 -1
样例输出 #1
123456789 0 -1
提示
对于 100 % 100 \% 100% 的数据, − 2 31 ≤ a , b , c < 2 31 -2^{31} \le a, b, c < 2^{31} −231≤a,b,c<231。
这道题我们首先来看他的输入要求:输入三个小于2的31次方的整数。
那么,现在就有一个问题:2的31次方,要不要用到long long呢?
答案是不用的。因为2的31次方-1就=2147483647,是int范围的最大值。
那么输入程序就变得很简单了:
int a,b,c;
cin>>a>>b>>c;
之后我们来解决输出:
输出:按每个数占8个字符的宽度输出。
那就有一个问题:占8个字符的宽度,该怎么输出呢?
有的同学会想:直接在输出后面加几个空格不就行了吗?
可能就是这样的:
cout<<a<<" "<<" "<<b<<" "<<" "<<c<<" ";
但是你们有没有想过:如果这个数不是一位数,并且不是第一个数怎么办呢?
就会形成这样的情况:
输出变成了
123456789 0 -1
乍一看没啥问题对吧,但是一提交就会发现:
爆40了。虽然部分得分也不错啊
但是这可是一道顺序题啊!!!再怎么说也是特别的难简单好吧!!
咳咳回到题目,那究竟是为什么呢?
答案啊,就是因为如果这个数他不是一位数,这个程序也会在前面加上8个空格。这样它就变成了占8+n(n为数字位数)位了,与题目的要求不符。
那这该怎么改呢??(来自蒟蒻的伤感)
这里啊,就需要用到一个神秘的函数——————setw()函数了。
这个函数可以控制输出的场宽,比如setw(5)就是把这个数占五个位置输出。
注意的是:此函数需要用到C++标准库:
#include <iomanip>
那经过两分半的改正,我们的代码就变成了这个样子:
cout<<setw(8)<<a<<" "<<setw(8)<<b<<" "<<setw(8)<<c<<endl;
现在的输出就变成了这样:
123456789 0 -1
乍一看也是和样例没啥区别,但是我们再提交试试&