有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; }