1 条题解
-
0
这道题属于逻辑模拟类问题,主要是对书籍页码排版的模拟,以下是详细分析:
1. 核心逻辑
- 页码初始化:在
main
函数的开头,通过循环for(int i = 1; i <= 100; i++) content[(i+1)/2][1-i%2] = i;
对content
数组进行初始化,该数组用于存储页码的对应关系,这里的计算方式是为了按照特定的规律存储页码,比如将页码按纸张的正反两面进行存储。 - 页码排版逻辑:
- 对于输入的页码数
pages
,先判断是否为1
,如果是则直接输出 “Sheet 1, front: Blank, 1” 并结束当前循环。 - 如果
pages
能被4
整除,计算出纸张数sheet = pages/4
和总页码数pagenum = sheet*2
,然后通过循环输出每张纸正反两面的页码,如 “Sheet 1, front: 页码1, 页码2” 和 “Sheet 1, back : 页码3, 页码4”。 - 如果
pages
不能被4
整除,计算出纸张数sheet = pages/4+1
和总页码数pagenum = sheet*2
,通过循环输出每张纸正反两面的页码,并且考虑到空白页的情况,如 “Sheet 1, front: Blank, 页码” 和 “Sheet 1, back : 页码, Blank”。
- 对于输入的页码数
2. 输入输出处理
- 输入:通过
while(cin>>pages&&pages)
持续读取输入的页码数pages
,只要输入的pages
不为0
就进行相应的处理。 - 输出:按照一定的格式输出每张纸的页码信息,包括纸张的编号、正面和反面的页码以及空白页的情况。
#include<iostream> #include<cstring> using namespace std; int pages,content[51][2],sheet,pagenum; int main(){ for(int i = 1; i <= 100; i++) content[(i+1)/2][1-i%2] = i; while(cin>>pages&&pages){ cout << "Printing order for " << pages << " pages:" << endl; if(pages==1){ cout << "Sheet 1, front: Blank, 1" << endl; continue; } if(pages%4==0){ sheet = pages/4; pagenum = sheet*2; int i = 1, j = pagenum, cnt = 1; while(i<j){ cout << "Sheet " << cnt << ", front: " << content[j][1] << ", " << content[i][0] << endl; cout << "Sheet " << cnt << ", back : " << content[i][1] << ", " << content[j][0] << endl; cnt++; i++, j--; } } else{ sheet = pages/4+1; pagenum = sheet*2; int i = 1, j = pagenum, cnt = 1, blank = pagenum*2-pages; while(i<j){ cout << "Sheet " << cnt << ", front: "; if(blank){ cout << "Blank, "<< content[i][0] << endl;; blank--; } else cout << content[j][1] << ", " << content[i][0] << endl; cout << "Sheet " << cnt << ", back : " << content[i][1] << ", "; if(blank){ cout << "Blank" << endl; blank--; } else cout << content[j][0] << endl; cnt++; i++,j--; } } } }
- 页码初始化:在
- 1
信息
- ID
- 314
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者