在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm ×× 594mm, 在对折的过程中长度直接取下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
样例输入1
A0
样例输出1
1189
841
样例输入 2
A1
样例输出 2
841
594
作者首先想到的就是利用switch解决这个问题,当然有其他很多的方法,但是这里就用switch尝试解决。
考虑到switch无法识别string类型,作者将每一个case的条件改成了‘A0’、‘A1’......‘A9’,试图将字符串转化成数字,但是结果并没有如我所愿。
于是在请教同学后想到了可以只识别‘A0’、‘A1’......‘A9’后面的0、1......9来解决问题。由于正好是字符串的第二位元素,可以直接用a[1]来进行索引,完整代码如下:
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string a;
cin >> a; //输入纸张规格A0~A9
int length[10], wide[10];
//A0规格的纸张为1189mm*841mm
length[0] = 1189;
wide[0] = 841;
for (int i = 1; i < 10; i++)
{
//对长和宽进行赋值,但并不一定长比宽数值大,所以后面输出需进一步筛选
length[i] = (length[i-1]>wide[i-1]?wide[i-1]:length[i-1]);
wide[i] = (length[i-1]>wide[i-1]?(length[i-1]/2):(wide[i-1]/2));
}
switch (a[1])
{
case '0':
cout << max(length[0],wide[0]) << endl;
cout << min(length[0],wide[0]) << endl;
break;
case '1':
cout << max(length[1], wide[1]) << endl;
cout << min(length[1], wide[1]) << endl;
break;
case '2':
cout << max(length[2], wide[2]) << endl;
cout << min(length[2], wide[2]) << endl;
break;
case '3':
cout << max(length[3], wide[3]) << endl;
cout << min(length[3], wide[3]) << endl;
break;
case '4':
cout << max(length[4], wide[4]) << endl;
cout << min(length[4], wide[4]) << endl;
break;
case '5':
cout << max(length[5], wide[5]) << endl;
cout << min(length[5], wide[5]) << endl;
break;
case '6':
cout << max(length[6], wide[6]) << endl;
cout << min(length[6], wide[6]) << endl;
break;
case '7':
cout << max(length[7], wide[7]) << endl;
cout << min(length[7], wide[7]) << endl;
break;
case '8':
cout << max(length[8], wide[8]) << endl;
cout << min(length[8], wide[8]) << endl;
break;
case '9':
cout << max(length[9], wide[9]) << endl;
cout << min(length[9], wide[9]) << endl;
break;
default:
break;
}
return 0;
}