有n个文件的长度记载在一个无符号64位整数数组中unsigned__int64 file_length[n],把这n
个文件从逻辑上按序首尾拼接在一起形成一个逻辑上的大文件,然后以每块长度为unsigned block_length把这个逻辑上的大文件划分成大小相等的数据块(当然,最后一块有可能比block_length小),请定义和实现一个函数,把边界块的序号集合返回给函数的调用者(第一个数据块序号为0)。
注:边界块指的是跨多个文件的数据块。
#include <iostream>
#include <vector>
using namespace std;
#define N 10
unsigned __int64 file_length[N]={15,120,250,600,5,5,30,65,70,100};
unsigned block_length=30;
vector<int> getIndex(unsigned __int64 *file_length,int n,unsigned block_size)
{
vector<int> res;
int index=0; //block序号
int i=0; //file_length序号
while(i<n)
{
if(file_length[i]==0) //特殊情况,某个文件长度为0则跳过
{
i++;
continue;
}
if(file_length[i]<block_size) //某个文件长度小于块
{
res.push_back(index);
int j=i+1;
int sum=file_length[i];
//一个block可能跨很多文件,将后面的文件长度累加起来,只到超过一个block
while(j<n)
{
sum+=file_length[j];
if(sum>block_size)
break;
j++;
}
file_length[j]=sum-block_size;
i=j;
}
else if(file_length[i]==block_size) //如果刚好相等就不算跨文件
i++;
else
file_length[i]-=block_size; //如果文件大于一个块,则分割为剩下的
index++; //块序号自增
}
return res;
}
int main(int argc,char *argv[])
{
vector<int> res=getIndex(file_length,N,block_length);
getchar();
return 0;
}