今天在学校的招聘会上笔试碰到的几个问题

llf_hust 2005-04-27 05:51:41
1.从已知数组d的前n个元素中找出部分元素序列之和等于total的元素序列,约定数组的元素都是正整数,且都小于等于total
2.洗牌程序:用任何语言,随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌
3.用内联函数写出求两个数中较大数的算法
...全文
2021 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
MagicCarmack 2005-05-08
  • 打赏
  • 举报
回复
谁说的INLINE中不可以用IF呢?
我还看见用递归的了
raymond323 2005-05-08
  • 打赏
  • 举报
回复
1.从已知数组d的前n个元素中找出部分元素序列之和等于total的元素序列,约定数组的元素都是正整数,且都小于等于total

贪婪法,每次取剩下的数中最大的一个,如果加上该数后总数大于了total,再取剩下的次大的数,依次类推,用一个数组来代表对应元素是否已入选,比较简单。
2.洗牌程序:用任何语言,随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌
用rand()和一个数组结合来做,每次生成1~52的数,生成后查数组中对应位(比如现在生成的是34,则查看数组中a[33],如果a[33]为1表示此数已分派,否则置该位为1,并且记录该位置牌点数为34。)
xiao_xiao_zi 2005-05-08
  • 打赏
  • 举报
回复
第2题用约瑟夫算法嘛
superslash 2005-05-08
  • 打赏
  • 举报
回复
studying~
dobear_0922 2005-05-05
  • 打赏
  • 举报
回复
各位继续,偶来学习学习~~~
sankt 2005-05-05
  • 打赏
  • 举报
回复
up
careprad 2005-05-05
  • 打赏
  • 举报
回复
呵呵,书上就是举的三目运算符的内联函数的例子!
qingyuan18 2005-05-05
  • 打赏
  • 举报
回复
1.从已知数组d的前n个元素中找出部分元素序列之和等于total的元素序列,约定数组的元素都是正整数,且都小于等于total

贪婪法,每次取剩下的数中最大的一个,如果加上该数后总数大于了total,再取剩下的次大的数,依次类推,用一个数组来代表对应元素是否已入选,比较简单。
2.洗牌程序:用任何语言,随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌
用rand()和一个数组结合来做,每次生成1~52的数,生成后查数组中对应位(比如现在生成的是34,则查看数组中a[33],如果a[33]为1表示此数已分派,否则置该位为1,并且记录该位置牌点数为34。)

visual4825 2005-05-04
  • 打赏
  • 举报
回复
mark
cosio 2005-05-04
  • 打赏
  • 举报
回复
结果会出现阶段  sum = 10, 073 73其实这两个是一样的?
cosio 2005-05-04
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<conio.h>

#define MAXN 100
int a[MAXN];
int b[6]={1,2,3,4,7};
int nLen=sizeof(b)/sizeof(b[0]);
int i;
int sum;

void combo(int m,int k)
{
int i,j;
for(i=m;i>=k;i--)
{
a[k]=i;
if(k>1)
combo(i-1,k-1);
else
{
int tmp=0;
for(j=a[0];j>0;j--)
{
tmp+=b[a[j]-1];
}
if(tmp==sum)
{
for(j=a[0];j>0;j--)printf("%4d",b[a[j]-1]);
printf("\n");
}
}
}
}

void main()
{
printf("Enter the sum:\n");

scanf("%d",&sum);

for(i=1;i<=nLen;++i)
{
a[0]=i;
combo(nLen,i);
}
}
通过!
cosio 2005-05-04
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <conio.h>

void TestArray(int d[],int n, int total)
{
int i , j;
double sum;
int count = 0;
for (i = 0;i<(1<<n);i++)
{
sum= 0.0;
for(j=0; j<n; j++)
{
if(i&(1<<j))
sum+= d[j];
}
if (total== sum)
{
printf("%d:",++count);

for (j= 0 ; j<n; j++)
{
if(i&(1<<j))
printf("%d+",d[j]);
printf("\b\b=%d.\n,total");
}
}
printf("\ntotal case :%d.\n",count);
getch();
return;
}
}

void main()

{
int d[7]= {1,2,3,4,5,10};
TestArray(d[7],2,15);
printf("close");
system("pause");

}

这个程序有点问题!
lausren 2005-05-03
  • 打赏
  • 举报
回复
我装,其实我看不太懂,呵呵,不过快了,疯狂学习中。。。。
mayingbao 2005-05-03
  • 打赏
  • 举报
回复

我晕
怎么这么多人乱说呀
御剑乐逍遥 2005-05-03
  • 打赏
  • 举报
回复
第二题:
算法:

纸牌数量 const int COUNT = 52;

用数组AssignAlready[COUNT]存放牌是否分配。如果第i (0 <= i < COUNT)张牌已经分配,那么AssignAlready [i] = 1。数组AssignAlready []的初始值均为0。

数组Poker[COUNT]存放发的牌。

在 0 至 51 中随机取一个整数iIndex,如果iIndex没有发出去,那么将iIndex放到Poker[]中去,如果iIndex发出去了,那么取其后面第一个没有发出去的牌(设定51后面是0)。



void poker(int * const a_iPoker, const int a_iCount)
{
int *AssignAlready = new int[a_iCount];
// Assume none of the cards assigned.
memset(AssignAlready,0,sizeof(int) * a_iCount);

int i;
int iIndex;

//Seed the random-number generator with current time so that
//the numbers will be different every time we run.
srand( (unsigned)time(NULL));

for(i = 0; i < a_iCount; i ++)
{
// get the random index
double dRand = (double)rand() * (a_iCount - 1)/ RAND_MAX;
iIndex = (int)dRand;

while(AssignAlready[iIndex] == 1)
{
iIndex = (iIndex + 1) % a_iCount;
}

a_iPoker[i] = iIndex;
AssignAlready[iIndex] = 1;
}
}



上函数中,
用到了头文件<time.h>。

在main中,输入如下语句:
const int COUNT = 52;
int Poker[COUNT];
poker(Poker,COUNT);
int i;
for (i = 0; i < COUNT ; i ++)
{
cout<< Poker[i] << endl;
}

即可打印出分好的52张牌。
(完毕) ^_^
zhousqy 2005-05-03
  • 打赏
  • 举报
回复
学习
御剑乐逍遥 2005-05-02
  • 打赏
  • 举报
回复
第一题:
解答:这个题可以用递归进行穷举。

假设

实现以上方法的函数为 int GetTotal(int *a_piArr,int a_in,int m_iTotal,int i_iIndex)。

其中

函数返回值为能够得到的个数,

const int *const a_piArr为数组的首地址,

const int a_in为从前n个元素中找,

const int m_iTotal为需要找的和,

int a_iNowTotal 为目前的和,

int a_iIndex 为目前的第index个数值,

int *const a_iTmpArr存放找到的几个数值的index,

int a_iTmpCnt存放目前的a_iTmpArr中存放的元素个数。



int GetTotal(const int* const a_piArr,const int a_in,const int a_iTotal,int a_iNowTotal,int a_iIndex,int * const a_iTmpArr,int a_iTmpCnt)

{

static int iRet = 0;

int i;

if(a_iIndex >= a_in || a_iNowTotal > a_iTotal)

{

return iRet;

}



while(a_iIndex < a_in)

{

while((a_iIndex < a_in) && (a_iNowTotal + a_piArr[a_iIndex] > a_iTotal))

{

a_iIndex ++;

}



if(a_iIndex >= a_in)

{

return iRet;

}



if(a_iNowTotal + a_piArr[a_iIndex] < a_iTotal)

{

a_iTmpArr[a_iTmpCnt] = a_iIndex;

GetTotal(a_piArr,a_in,a_iTotal,a_iNowTotal + a_piArr[a_iIndex],a_iIndex + 1,a_iTmpArr,a_iTmpCnt + 1);

}else // =

{

a_iTmpArr[a_iTmpCnt] = a_iIndex;

for(i = 0; i <= a_iTmpCnt; i ++)

{

cout<<a_iTmpArr[i] <<":"<< a_piArr[a_iTmpArr[i]] <<" " ;

}

cout << endl;

}

a_iIndex ++;

} // end while(a_iIndex < a_in)



return iRet;

}



例如:

在main()中运行如下语句:

int iTmp[n];

int id[] = {2,5,5,2,5,6,3};

int iTotal = 12;

int iRet;

iRet = GetTotal(id,n,iTotal,0,0,iTmp,0);

即会将数组id[]的前5个数中和等于12的几个值的序号和值打印出来。

(完毕)

From http://www29.websamba.com/zxzjs3/more.asp?name=frank&id=2
guofu_x 2005-04-29
  • 打赏
  • 举报
回复
干脆用泛型算法写
tfq 2005-04-29
  • 打赏
  • 举报
回复
learning
MagicCarmack 2005-04-29
  • 打赏
  • 举报
回复
3、inline double max(double a, double b)
{
return a>b?a:b;
}

这样是不是更好一点呢?
加载更多回复(64)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧