计算机找工作笔试题集锦(详解)_算法问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.

题目射击运动员10发打中90环有多少种可能,请编写程序计算出来,并打印出结果,0环和10环均有效

答案递归算法:

#include

#include

int f(int n, int m)

{ //n次射中m环

int fn=0,i;

if(m<0||m>10*n) return 0;

if(n==1) return 1;

for(i=0;i<=10;i++) //本次射中的为i环,剩下的n-1次要射m-i环

fn+=f(n-1,m-i);

return fn;

}

int main()

{

int n,m;

printf("Please enter n and m:");

scanf("%d%d",&n,&m);

printf("\n%d发打中%d环有%d种可能.\n",n,m,f(n,m));

system("PAUSE");

return 0;

}

非递归算法:

算法分析:

由于中90环和中10环的概率是一样的 (可用数学归纳法证明)

所以在此只需穷举和10的个数即可。

count = 0;

for(a=0;a<=10;a++)

for(b=0;b<=10-a;b++)

for(c=0;c<=10-a-b;c++)

for(d=0;d<=10-a-b-c;d++)

for(e=0;e<=10-a-b-c-d;e++)

for(f=0;f<=10-a-b-c-d-e;f++)

for(g=0;g<=10-a-b-c-d-e-f;g++)

for(h=0;h<=10-a-b-c-d-e-f-g;h++)

for(i=0;h<=10-a-b-c-d-e-f-g-h;i++)

for(j=0;h<=10-a-b-c-d-e-f-g-h-i;j++)

{

count++;

}

printf("%d\n",count);

int GetFifoBuffer(int size, void *data);

int FifoBuffer::GetQNodeBuffer(int size, FIFOQNode *node, void * data);

int GetSize();

private:

int m_size;

FIFOQNode* m_QHead;

FIFOQNode* m_QTail;

};

FifoBuffer::FifoBuffer()

{

m_size = 0;

m_QHead = m_QTail = NULL;

}

FifoBuffer::~FifoBuffer()

{

while(m_QHead != NULL)

{

FIFOQNode *p = m_QHead;

m_QHead = m_QHead->next;

delete [] p->data;

delete p;

}

}

bool FifoBuffer::PutFifoBuffer(int size, void *data)

{

if(size <= 0)

return false;

if(m_size + size > MAXBUFFER)

return false;

m_size += size;

char *newData = new char[size];

memcpy(newData, (void*)data, size);

FIFOQNode* pNewNode = new FIFOQNode();

pNewNode->data = newData;

pNewNode->size = size;

pNewNode->next = NULL;

if(m_QHead == NULL)

m_QHead = m_QTail = pNewNode;

else

{

m_QTail->next = pNewNode;

m_QTail = pNewNode;

}

return true;

}

int FifoBuffer::GetQNodeBuffer(int size, FIFOQNode *node, void * data) {

if(size <= 0 || size > node->size || node == NULL)

return 0;

memcpy(data, node->data, size);

FIFOQNode *p = node;

if(size < node->size)

{

char *newData = new char[node->size - size];

memcpy((void*)newData, &node->data[size], node->size - size);

FIFOQNode* pNewNode = new FIFOQNode();

pNewNode->data = newData;

pNewNode->size = node->size - size;

pNewNode->next = node->next;

node = pNewNode;

}

else

{

node = node->next;

}

delete [] p->data;

delete p;

return size;

}

int FifoBuffer::GetFifoBuffer(int size, void *data)

{

if(size <= 0)

return 0;

if(size > m_size)

size = m_size;

FIFOQNode *curNode = m_QHead;

int remainSize = size;

while(curNode != NULL && remainSize > curNode->size)

{

int cpSz = GetQNodeBuffer(curNode->size, curNode,

(void*)&((char*)data)[size - remainSize]);

remainSize -= cpSz;

}

if(remainSize > 0)

GetQNodeBuffer(remainSize, curNode, (void*)&((char*)data)[size - remainSize]);

m_size -= size;

相关文档
最新文档