计算机找工作笔试题集锦(详解)_算法问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;