1 条题解

  • 0
    @ 2025-5-6 20:07:31

    这道题属于逻辑模拟类问题,主要是对书籍页码排版的模拟,以下是详细分析:

    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
    上传者