首页 > 试题广场 >

有n个文件的长度记载在一个无符号64位整数数组中unsign

[问答题]
有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;
}

发表于 2015-09-19 11:28:12 回复(0)
vector<int> findSeq(unsigned __int64* file_length,int n, unsigned block_length)
{
    vector<int> seqnums;
    unsigned __int64 totalSize = 0;
    int preSeq=-1;
    for(int i=0; i<n;i++){
        totalSize += file_length[i];
        int seq = totalSize/block_length;
        if(!(totalSize%block_length)){
        seq--;
        }
       if(preSeq==seq){
            if(seqnums.empty()||seqnums.back()!=seq){
                  seqnums.push_back(seq);
            }
       }
 preSeq = seq;
    }
    return seqnums;
}
编辑于 2015-07-18 16:02:10 回复(0)
下面这个函数怎么样?

set<int>& fun(const unsigned_int64 *file_length, const unsigned block_length,int n, set<int> &iset)
{
unsigned_int64 fTotalLength = 0;
unsigned int num;
for (int i=0; i < n; ++i)
{
fTotalLength += *(file_length+i);
double temp = fTotalLength/block_length;
num = static_cast<int> (temp);
if((temp-num)<0.000001)    //文件边界正好落在块边界上
contiune;
iset.insert(num);
}
return iset;
}

发表于 2015-06-18 17:23:22 回复(0)
vector<int> findedge(int* file_length, unsigned int block_length)
{
   unsigned_int64 file_size = 0;
   for(int i = 0; i < n; i++)
   {
      file_size += n*file_length[n];
   }
   int block_num = 0;
   bolck_num = file_size/bolck_length;
   vector<int> block_col;
   int block_index = 0;
   block_col.push_back(block_index);
   for(int i = 0; i < block_num; i++)
   {
      block_index+=block_num;
      block_col.push_back(block_index);
   }
   return block_col;
}
发表于 2014-11-14 13:28:12 回复(2)