1 条题解

  • 0
    @ 2025-5-29 11:07:57

    关键信息

    • 输入格式:时间以HH:MM:SS形式给出,其中:
      • 小时HH范围:00-23(24小时制)
      • 分钟MM和秒SS范围:00-59
    • 输出要求
      • 垂直格式:按“小时→分钟→秒”顺序,将每个时间分量转换为6位二进制,直接拼接成18位字符串。
      • 水平格式:按“位位置”顺序,依次取小时、分钟、秒的同一位(如第0位、第1位等),每个位置拼接3位(小时+分钟+秒),最终形成18位字符串。

    解题思路

    1. 时间分量拆分与二进制转换

    • 拆分时间:将输入的HH:MM:SS拆分为小时、分钟、秒三个整数。
    • 转换为6位二进制:每个分量需转换为固定6位二进制字符串,不足6位时在左侧补零。例如:
      • 小时10(十进制)→ 二进制1010 → 补零为001010
      • 分钟37 → 二进制100101(正好6位)

    2. 垂直格式生成

    直接按“小时二进制→分钟二进制→秒二进制”的顺序拼接,得到18位字符串。例如:

    • 小时10(001010)、分钟37(100101)、秒49(110001)→ 垂直格式为001010100101110001

    3. 水平格式生成

    按位位置(0到5)依次处理:

    • 对于每个位置i(0≤i≤5),分别取小时、分钟、秒的二进制字符串的第i位,拼接成3位字符串。
    • 将6个位置的结果依次拼接,得到18位字符串。例如:
      • 小时10(001010)、分钟37(100101)、秒49(110001)的第0位分别为011,拼接为011
      • 第1位分别为000,拼接为000
      • 依此类推,最终得到水平格式001010100101110001
    #include<stdio.h>
     
    int main(){
    	int n,ca,i,j,hour,min,sec,a[6][3];
    	char c[10];
    	scanf("%d",&n);
    	for(ca=1; ca<=n; ca++){
    		scanf("%s",c);
    		hour = (c[0]-'0')*10 + c[1] - '0';
    		min = (c[3]-'0')*10 + c[4] - '0';
    		sec = (c[6]-'0')*10 + c[7] - '0';
    		for(i=32,j=0; i; i>>=1,j++){
    			a[j][0] = hour&i ? 1 : 0;
    			a[j][1] = min&i ? 1 : 0;
    			a[j][2] = sec&i ? 1 : 0;
    		}
    		printf("%d ",ca);
    		for(i=0;i<6;i++){
    			for(j=0;j<3;j++){
    				printf("%d",a[i][j]);
    			}
    		}
    		printf(" ");
    		for(j=0;j<3;j++){
    			for(i=0;i<6;i++){
    				printf("%d",a[i][j]);
    			}
    		}
    		printf("\n");
    	}
    }
    
    • 1

    信息

    ID
    2789
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者