列表

详情


NC200050. Vanis and Weird Message

描述

某一天,Vanis收到了一串奇怪的序列,经过研究,他似乎知道了如何还原这段序列原本的信息。

1. 这串序列中的每个元素都是一个介于[-128, 127]的整数,即是一串原本存储于内存中连续字节单元的字节序列。
2. 序列的长度为n。
3. 序列可以被分组,每一组的开头会有一个整数h,其值只会取4或8两种值,表示在这个整数之后(不包含整数h)连续的h个数应当被视作一个整体。更确切的说,如果h是4,则之后的连续4个字节是以大端法存储的4字节int类型数据(此处指C/C++中的类型);如果h是8,则之后连续的8个字节是以大端法存储的8字节long long类型数据(此处指C/C++中的类型)。

于是Vanis想要还原这个序列,但是很不幸的是所使用的计算机在存储数据时是按照小端法存储的,于是想请你帮忙(虽然你当前所使用的计算机也是按照小端法存储数据的)。

输入描述

第一行输入一个正整数n。
第二行输入n个用空格符分隔的整数,表示这个长度为n的序列,第i个数记作a_i

数据规范:
* .
* .
* 输入数据保证符合题目关于分组的描述。

输出描述

每成功解析一组数,便在一行输出这个数。详见样例。

示例1

输入:

14
4 1 50 -112 29 8 0 7 35 65 -18 -99 13 29

输出:

20090909
2009090920090909

示例2

输入:

5
4 -1 -1 -1 -1

输出:

-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 1368ms, 内存消耗: 86936K, 提交时间: 2020-08-03 14:46:38

# 君指先跃动の光は、私の一生不変の信仰に、唯私の超电磁炮永生き!
from sys import stdin, stdout
import math
from itertools import permutations


def solution():
    n = int(input().strip())
    arr = list(map(int, input().strip().split()))
    cur = 0
    while cur < n:
        cnt = arr[cur]
        cur += 1
        tmp = ''
        for i in range(cnt):
            if arr[cur] < 0:
                arr[cur] = 256 + arr[cur]
            tmp += bin(arr[cur])[2:].zfill(8)
            cur += 1
        ans = int(tmp, 2)
        if tmp[0] == '1':
            ans -= 1 << (8 * cnt)
        print(ans)

solution()

C++14(g++5.4) 解法, 执行用时: 120ms, 内存消耗: 2664K, 提交时间: 2019-12-07 13:29:47

#pragma GCC optimize("-O3")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void Main();
#ifdef ConanYu
#include "local.hpp"
#else
#define debug(...) do { } while(0)
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  Main();
}
#endif

void Main() {
  int n; cin >> n;
  while(cin >> n) {
    ll ans = 0;
    for(int i = 0; i < n; i++) {
      ll t; cin >> t;
      t &= 0xff;
      ans <<= 8;
      ans |= t;
    }
    if(n == 4) cout << (int)ans << "\n";
    else cout << ans << "\n";
  }
}

C++(clang++ 11.0.1) 解法, 执行用时: 708ms, 内存消耗: 2568K, 提交时间: 2023-01-18 15:18:03

#include<bits/stdc++.h>
using namespace std;
int a[10];
void con(int h){
	long long sum=0;
	int  b=0;
if(a[0]<0)b=1;
	for(int i=0;i<h;i++)
	{
		if(a[i]<0)a[i]+=256;
	 sum=sum*256+a[i];
	}
if(h==4)
	cout<<(int)sum<<endl;	
else cout<<sum<<endl;
}
int main()
{
int n,i=0,h;
cin>>n;
while(i<n){
	i++;
	cin>>h;
	for(int j=0;j<h;j++,i++)
	cin>>a[j];
	con(h);
}
return 0;
}

上一题