MM要我帮她做的考试题,共5题,在线求助,高分相谢。

KevinJoan 2005-06-13 01:29:32
1
百钱买百鸡问题:公元5 世纪末,我国古代数学家张丘建在《算经》中提出了如下问题:鸡翁一值钱五,
鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何。
2
用蒙特卡罗方法求π的近似值。蒙特卡罗方法(Monte Carlo Method)也称随机抽样技术或统计实验方法,
是一种应用随机数进行仿真实验的方法。用蒙特卡罗方法计算π的近
似值的基本思路是:
由于圆的面积有
2 S Rπ =
当R=1 时,S= π。而圆的方程为
2 2 x +y =1
如图所示,1/4 的圆面积为x 轴、y 轴和上述方程所包围的
部分。如果在1 的面积中均匀的落入随机点,则落入1/4 圆中的点
的概率就是1/4 圆的面积。
3
大花猫是捕捉老鼠的能手,每天要抓到不少老鼠。但它吃掉老鼠之前,先要老鼠列队报数,第一批吃掉单
数的;剩下的老鼠重新报数,第一批仍吃掉单数的⋯⋯最后剩下一只老鼠可以被保留,与第二天抓来的老鼠
一起重新排队报数。一连好几天,大花猫发现最后留下来的都是一只机灵的小白鼠。当大花猫问它,想什么
办法每天都能留下来时,小白鼠说:“每天排队以前,我都先数一数你抓到了多少只老鼠,然后,我站在一个
合适的位置上。”问题是小白鼠每天应该站在什么位置上才不被吃掉?请编程求解。
4
五家共井问题:我国古代数学巨著《九章算术》卷第八·第十三题为“五家共井,甲二绠(汲水用的井绳)
不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六
绠不足,如甲一绠。如各得所不足一绠,皆逮(dia,及)。问井深,绠长各几何。答曰:井深七丈二尺一寸,
甲绠长二丈六尺五寸,乙绠长一丈九尺一寸,丙绠长一丈四尺八寸,丁绠长一丈三尺九寸,戊绠长七尺六寸。”
这是世界上最古老的不定方程问题,请你编程验证答案。
5
编写一个程序,该程序模拟一次扑克洗牌,并给四个人发牌(所有的扑克牌全部发完),输出每个人得到
的扑克。
...全文
877 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
chichujn 2005-06-17
  • 打赏
  • 举报
回复
以前用C编的,第5题:
#include<conio.h>
#include<stdlib.h>

#define IF if((b[i-1]%13+2)>10)
#define J printf("J\t");break;
#define Q printf("Q\t");break;
#define K printf("K\t");break;
#define A printf("A\t");
#define SWITCH switch(b[i-1]%13+2){case 11:J case 12:Q case 13:K case 14:A}
#define P else printf("%d\t",b[i-1]%13+2);break;

main(){
int i,j,k,flag=0,a[52],b[52];
for(i=0;i<52;i++)
a[i]=i;
randomize();
for(i=52;i>0;--i){
j=random(i);
b[i-1]=a[j];
for(k=j;k<51;k++)
a[k]=a[k+1];
switch(b[i-1]%4){
case 0:printf("\3");IF SWITCH P /*switch语句嵌套*/
case 1:printf("\4");IF SWITCH P
case 2:printf("\5");IF SWITCH P
case 3:printf("\6");IF SWITCH P
}
flag++;
if(flag%4==0)
printf("\012");
}
getch();
}
aSalt 2005-06-17
  • 打赏
  • 举报
回复
好贴,收藏
zhang99092 2005-06-17
  • 打赏
  • 举报
回复
第五题:
// 使用4*13的二位数组表示一副扑克牌,第一维表示花色,第二维
// 表示数,数组元素中的值表示洗牌后,该扑克牌的位置。
#include <iostream>
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>

void shuffle( int [][ 13 ] );
void deal( const int [][ 13 ],
const char *[], const char *[] );

void main()
{
const char *suit[ 4 ] =
{ "黑桃","红桃","梅花","方块" };

const char *face[ 13 ] =
{ "A", "2", "3", "4",
"5", "6", "7", "8",
"9", "10", "J", "Q", "K" };

int deck[ 4 ][ 13 ] = { 0 };

srand( time( 0 ) );

shuffle( deck );
deal( deck, face, suit );
}

void shuffle( int wDeck[][ 13 ] )//用来洗牌
{
int row;
int column;

for ( int card = 1; card <= 52; card++ ) {
do {
row = rand() % 4;
column = rand() % 13;
} while( wDeck[ row ][ column ] != 0 );
wDeck[ row ][ column ] = card;
}
}

void deal( const int wDeck[][ 13 ], const char *wFace[],
const char *wSuit[])//用来发排
{

for ( int card = 1; card <= 52; card++ )
for ( int row = 0; row <= 3; row++ )
for ( int column = 0; column <= 12; column++ )
if ( wDeck[ row ][ column ] == card ) {
cout<< setiosflags(ios::left)
<< setw(5)
<< wSuit[ row ]
<< wFace[ column ]
<< ( card % 4 == 0 ? '\n' : '\t' );
}
}
ldc 2005-06-16
  • 打赏
  • 举报
回复
累死了,明天再给出后面两题的答案,大家+U啊,呵呵
ldc 2005-06-16
  • 打赏
  • 举报
回复
前三题点评:
楼主出了题就跑了,真是不厚道,呵呵
算了,就让我来替楼主点评一下
〔1〕,本题并不难,考察的重点是表达式的类型转换。virm(查无此人)等同学之所以出错,就在于此,比如if (5*g+3*m+x/3==100 && x%3==0)中,由于x是int类型,所以x/3会被取整,使得计算结果有可能不精确,采用x/3.0如何?也不行,因为得到的结果是浮点类型,不能直接和100(整数)相比较。所以本题的正确做法,应该是等式两边同乘与3,化为15×g+9×m+x==300,这样就没有类型转换的问题了。如果一定要用浮点来比较,也不能采用==,而是取一个比较小的正整数delta(比如0.1e-6),然后比较|5*g+3*m+x/3.0-100|<delta


〔2〕,本题题目有点乱,本质上来看,可以这样理解:如果在一个(0,0)-(1,1)的矩形内随机取点,点的坐标是(x,y),则点落在矩形内的概率为1(废话),而落在圆心为(0,0),半径为1的1/4圆内的概率=πR×R/4=π/4,因此,如果随机取n个点,这n个点的取值范围0<x<R, 0<y<R, 那么只要把满足 x*x+y*y<=R*R 的点的数目统计出来(假设为c),然后c/n=π/4 ,即可求出。具体程序可以参考我上面的程序

〔3〕,本题其实可以使用公式,位置p=(log2(n))取整+1,即n的2为底的log值再取整+1。但为什么会得到这样的公式?我上面的程序可以把每一轮的被选出的老鼠的位置显示出来,最后剩下的就是要站的位置了。其精髓是建立一个数组,初始化为0,然后只要一个被选出,就设置其值为1,一直进行下去,直到n,该轮选完,然后又重第一个非1的数组开始,重新选择,如此这般下去。
ldc 2005-06-16
  • 打赏
  • 举报
回复
//第三题
#include <stdio.h>
#include <conio.h>
#include <memory.h>

#define MAX_MOUSE 100
#define NO 0
#define YES !NO

main()
{
int n, i, mouse[MAX_MOUSE]={0};
repeat:
printf("\n Please input the mouse's count: n=(0~%d)", MAX_MOUSE);
scanf("%d", &n);
if(n<0) return 0;
else if(n>MAX_MOUSE) goto repeat;

memset(mouse, 0,MAX_MOUSE*sizeof(int));
{
int p=0, count=0, quitflag=NO, size=n; //count 记录单双号, p 记录实际的序号
while(quitflag==NO){
while(mouse[p] && p<n)p++; //找到下一个未出列的元素
if(p>=n){//如果p到了最后,表示本轮已经搜索完
printf("\none turn\n"); count=0; p=0;
}
else{
if(count % 2==0){//如果count是单数,则
mouse[p]=1;
printf(" [%d](原号: %d) ", count, p);
count++; p++; size--;
}else{
p++; count++;
}
if(size<=0) quitflag=1;
}}}
goto repeat;
}
mostideal 2005-06-15
  • 打赏
  • 举报
回复
mark!!
virm 2005-06-15
  • 打赏
  • 举报
回复
呵呵,
修正一下第一题的错误:
#include<stdio.h>
main()
{
int g , m , x;

for (g=1;g<21;++g)
{
for (m=1;m<34;++m)
{
x=100-m-g;
if (5*g+3*m+x/3==100 && x%3==0)
printf("GongJi %d MuJi %d Xiaoji %d \n",g,m,x);
}
}
}
virm 2005-06-15
  • 打赏
  • 举报
回复
第一题:
#include<stdio.h>
main()
{
int g , m , x;

for (g=1;g<21;++g)
{
for (m=1;m<34;++m)
{
x=100-m-g;
if (5*g+3*m+x/3==100 && x%3==0)
printf("MuJi %d , GongJi %d, Xiaoji %d \n",g,m,x);
}
}
}
aSalt 2005-06-15
  • 打赏
  • 举报
回复
学习~~~~~~~~第五题比较有实际意义,高手出来做一下
defyer007 2005-06-14
  • 打赏
  • 举报
回复
1,3,5都还好
4偶古文学的不好
jaygaoson 2005-06-14
  • 打赏
  • 举报
回复
第五题

只要用到srand(),rand(),再将其所得随机数%13,将大于10的数转为J,Q,K 即可。至于一种牌的4种不同的大小,也可以用随机得到,还要加多一个判断是否所得的随机数(所得的牌已存在,就不要再重复)。
lcuestc 2005-06-14
  • 打赏
  • 举报
回复
第一题相对较好的解法:
鸡翁数目x、母y、雏z,有x+y+z=100和5*x+3*y+z/3=100,
两式变换相减得14*x+8*y=200。
由此,x的范围可以得到[0, 14],循环,由14*x+8*y=200可得y的值,
再用x+y+z=100判断是否符合,15次循环即可解决。

zf_ben 2005-06-14
  • 打赏
  • 举报
回复
3题:
int n,count=0;
scanf("%d",&n);//老鼠的只数

while(1)
{
if(n/2!=1)
{
count++;
}
else if(n/2==1)
break;
n=n/2;
}
int por=pow(2,++count);
printf("%d",por);
Leafyuanyuan 2005-06-14
  • 打赏
  • 举报
回复
?
hotstud 2005-06-14
  • 打赏
  • 举报
回复
第三题:
(DELPHI7.0下测试成功!)呵呵。

program mice;

{$APPTYPE CONSOLE}

uses
SysUtils,
Math;

function Position(MCount:integer):integer;
var PTemp:extended;
Exponent,i:integer;
begin
PTemp:=log2(MCount);
SetRoundMode(rmTruncate);
Exponent:=round(PTemp);
result:=1;
for i:=1 to Exponent do
result:=result*2;
end;
var day:integer;
MiceCount:integer;
begin
for day:=1 to 100 do
begin
writeln(format('Please input mice count in %d day!If input 0,exit this program.',[day]));
readln(MiceCount);
if MiceCount=0 then
break;
writeln(format('If the white mouse in %d,can live in next day!',[position(MiceCount)]));
end;

end.
ljan 2005-06-14
  • 打赏
  • 举报
回复
唉,碰到这种问题我就头晕,笨了点
hushuangyan74 2005-06-14
  • 打赏
  • 举报
回复
后面的有点难呀!
yuanjian_530 2005-06-14
  • 打赏
  • 举报
回复
# include <stdio.h>

main(){
int n,sum=1;
printf("please input numbers of mouse:");
scanf("%d",&n);
while(1){
sum=sum*2;
if(sum==n) break;
else if(sum>n){
sum=sum/2;
break;
}
}
printf("This mouse seat %d",sum);
}
ldc 2005-06-13
  • 打赏
  • 举报
回复
//第二题
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define R 100

main()
{
int count=0, x, y, i, n;
srand((unsigned int)time(NULL));
while(1){
printf("\n Please input the loop count n=");
scanf("%d", &n);
if(n>0)
break;
}
for(i=0; i<n; i++){
x=rand() % R;
y=rand() % R;
if( x*x+y*y <= R*R ) count++;
}

printf("\nThe PI= %lf", (double)count/n*4);

getch();

}
加载更多回复(11)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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