问题求解 作业.docx

上传人:b****7 文档编号:25973083 上传时间:2023-06-16 格式:DOCX 页数:17 大小:17.80KB
下载 相关 举报
问题求解 作业.docx_第1页
第1页 / 共17页
问题求解 作业.docx_第2页
第2页 / 共17页
问题求解 作业.docx_第3页
第3页 / 共17页
问题求解 作业.docx_第4页
第4页 / 共17页
问题求解 作业.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

问题求解 作业.docx

《问题求解 作业.docx》由会员分享,可在线阅读,更多相关《问题求解 作业.docx(17页珍藏版)》请在冰豆网上搜索。

问题求解 作业.docx

问题求解作业

一、找规律

1,2,4,7,8,11,14,16,17,19,22,26,28,29,41,44,?

1.解题思路:

利用switch语句过滤掉不需要的自然数

2.源代码:

#include

usingnamespacestd;

intmain()

{

inti=44;

i=i+1;

for(intj=0;j<10;j++)//两位数循环10次过滤掉30-40的数

{

switch

(1)

{

case1:

if(i%3==0)

i++;

case2:

if(i%5==0)

i++;

case3:

if(i%10==3)

i++;

case4:

if(i/10==3)

i++;

}

}

cout<

return0;

}

二、

鸡兔同笼:

今有鸡、兔若干,它们共有a个头和b只脚,问鸡兔各多少?

1.解题思路:

腿的数目减去二倍头数目的积的差的二分之一就是兔子的数目t=(b-2*a)/2

鸡的数目是头的数目减去兔数目的差j=a-t。

2.源代码:

#include

usingnamespacestd;

intmain()

{

inta,b,j,t;//头,腿,鸡,兔

cout<<"输入头的数量a:

"<

cin>>a;

cout<<"输入腿的数量b:

"<

cin>>b;

if(b%2!

=0||b<2*a||b>4*a)//排除错误输入

cout<<"数目输入错误";

else//计算鸡和兔的数量并输出

t=(b-2*a)/2;

j=a-t;

cout<<"鸡的数目为:

"<

cout<<"兔的数目为:

"<

return0;

}

三、

随机发牌:

去掉大小王,发给4个人,每人发13张,要求分四行,并按花色和牌点排序。

样例:

SAK9HKT9876DQ32CJ。

1.解题思路:

建立二维数组初始化牌堆并洗牌,再用switch语句输出特殊的花色和牌点。

2.源代码:

#include

#include

#include

usingnamespacestd;

voidinit(inta[][13])//初始化牌组,四色牌顺序排列

{

inti,j;

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

for(j=0;j<13;++j)

a[i][j]=i+1;

}

voidswap(int*a,int*b)//洗牌函数

{

intt;

t=*a;*a=*b;*b=t;

}

voidshuffle(int*begin,int*end)//随机打乱顺序

{

int*temp;

for(temp=begin;temp!

=end;++temp)

swap(temp,begin+rand()%(end-begin));

}

voidshow(inta[][13])//显示每个玩家手中的牌

{

inti,j,k;

for(k=0;k<4;++k)//输出四个玩家

{

cout<<"person"<

";

for(i=0;i<4;++i)//四种花色

for(j=0;j<13;++j)//十三种牌

if(a[i][j]==k+1)

{

switch(i)//顺序输出四种花色

{

case0:

cout<<'S';break;

case1:

cout<<'H';break;

case2:

cout<<'D';break;

case3:

cout<<'C';break;

default:

cout<

}

switch(j)//顺序输出十三种牌

{

case0:

cout<<'A';break;

case9:

cout<<'T';break;

case10:

cout<<'J';break;

case11:

cout<<'Q';break;

case12:

cout<<'K';break;

default:

cout<

}

cout<<"";

}

cout<

}

}

intmain()

{

inta[4][13],*p;

srand(time(0));//初始化随机数种子

init(a);//初始化牌组

p=(int*)a;//用于传值给shuffle函数

shuffle(p,p+4*13);//将牌组的首尾指针传给shuffle函数

show(a);//输出

return0;

}

四、12球问题

1.解题思路:

第一次称八个,如果平衡,说明问题球在没称的四个中,第二步从这四个球中拿出三个放一边,另一边拿三个正常球,如果平,则球就是没称过的那个球,否则球在拿上来的三个球里,而且如果这三个球比三个正常球重,说明有问题的球重,否则轻。

第三步随便从三个中拿两个出来称,如果平,就是余下的那个,如果不平,则根据第二步得出的球是重还是轻可知问题球是重点还是轻的那个。

如果第一次不平衡,则记下哪四个重,哪四个轻。

第二次从四个重的球中拿出三个,再加上一轻的一边的球放左边,右边放余下的重的一边的球加三个正常球,这样如果左边重,则问题球在左边的三个重球中,而且它比普通球重,因为右边是三个球是正常球,余下那个如果是比正常球重的话,应该是右倾,而不是左倾。

如果右边重,则问题球就是右边那个唯一的重边的球。

如果平衡,说明不所有称上球正常,问题球不是重球,而是轻球,而且在三个未拿上称的轻边球中。

这样第三次称是就已知哪三个球有问题,而且问题是偏重还是偏轻,随便拿两个球一称,如果平衡,说明球是没称的那个,如果不平衡,则根据第二步得出的结论,找出偏轻,或偏重的那个球既可。

2.源代码:

#include

usingnamespacestd;

intbadballs(intsize[12],bool&bisH)

{

intseat=0;//坏球的位置

inta[4],b[4],c[4];

for(inti=0;i<4;i++)

{

a[i]=size[i];//a组

b[i]=size[i+4];//b组

c[i]=size[i+8];//c组

}

if(a[0]+a[1]+a[2]+a[3]==b[0]+b[1]+b[2]+b[3])//第一次称

{

if(a[0]+a[1]+a[2]==c[0]+c[1]+c[2])//第二次称

{

if(a[0]>c[3])//第三次称

{

seat=3+8;

bisH=false;

}

else//第三次称

{

seat=3+8;

bisH=true;

}

}

elseif(a[0]+a[1]+a[2]>c[0]+c[1]+c[2])//第二次称

{

if(c[0]==c[1])//第三次称

{

seat=2+8;

bisH=false;

}

elseif(c[0]>c[1])//第三次称

{

seat=1+8;

bisH=false;

}

else//第三次称

{

seat=0+8;

bisH=false;

}

}

else//第二次称

{

if(c[0]==c[1])//第三次称

{

seat=2+8;

bisH=true;

}

elseif(c[0]>c[1])//第三次称

{

seat=0+8;

bisH=true;

}

else//第三次称

{

seat=1+8;

bisH=true;

}

}

}

elseif(a[0]+a[1]+a[2]+a[3]>b[0]+b[1]+b[2]+b[3])//第一次称

{

if(b[0]+c[0]+c[1]+c[2]==a[0]+b[1]+b[2]+b[3])//第二次称

{

if(a[1]==a[2])//第三次称

{

seat=3;

bisH=true;

}

elseif(a[1]>a[2])//第三次称

{

seat=1;

bisH=true;

}

else//第三次称

{

seat=2;

bisH=true;

}

}

elseif(b[0]+c[0]+c[1]+c[2]>a[0]+b[1]+b[2]+b[3])//第二次称

{

if(b[1]==b[2])//第三次称

{

seat=3+4;

bisH=false;

}

elseif(b[1]>b[2])//第三次称

{

seat=2+4;

bisH=false;

}

else//第三次称

{

seat=1+4;

bisH=false;

}

}

else//第二次称

{

if(c[0]==a[0])//第三次称

{

seat=4;

bisH=false;

}

elseif(c[0]>a[0])//第三次称

{

seat=0;

bisH=false;

}

else//第三次称

{

seat=0;

bisH=true;

}

}

}

else//第一次称

{

if(b[0]+c[0]+c[1]+c[2]==a[0]+b[1]+b[2]+b[3])//第二次称

{

if(a[1]==a[2])//第三次称

{

seat=3;

bisH=false;

}

elseif(a[1]>a[2])//第三次称

{

seat=2;

bisH=false;

}

else//第三次称

{

seat=1;

bisH=false;

}

}

elseif(b[0]+c[0]+c[1]+c[2]>a[0]+b[1]+b[2]+b[3])//第二次称

{

if(c[0]==a[0])//第三次称

{

seat=4;

bisH=false;

}

elseif(c[0]>a[0])//第三次称

{

seat=0;

bisH=false;

}

else//第三次称

{

seat=0;

bisH=true;

}

}

else//第二次称

{

if(b[1]==b[2])//第三次称

{

seat=3+4;

bisH=true;

}

elseif(b[1]>b[2])//第三次称

{

seat=1+4;

bisH=true;

}

else//第三次称

{

seat=2+4;

bisH=true;

}

}

}

returnseat;

}

intmain()

{

intsize[12]={0,1,1,1,1,1,1,1,1,1,1,1};

boolbisH;

intseat=badballs(size,bisH);

if(seat>=0)

{

cout<<"第"<

if(bisH)

{

cout<<"重!

"<

}

else

{

cout<<"轻!

"<

}

}

else

{

cout<<"输入错误!

"<

}

}

五、

任意给一个自然数n1(不为0),取其各位数字的平方和(可以称为数的平方和运算),得n2,再取n2的各位数字的平方和,得n3,…重复此过程有限步,必然得到数1或145。

1.解题思路:

建立函数求某个数的各位数的平方和,再循环调用,直到出现1或145.

2.源代码:

#include

usingnamespacestd;

voidloop(intn,int&step)

{

step=step+1;

intt1=1,t2=0;

intj=n;

while(j/10!

=0)

{

t1++;

j=j/10;

}

intk=n;

intsum=0;

while(--t1>=0)

{

t2=k%10;

sum=sum+t2*t2;

k=k/10;

}

cout<<"步骤数="<

if(sum==1||sum==145)

step++;

elseloop(sum,step);

}

intmain()

{

intn;

intcount=0;

cout<<"输入数字n:

"<

cin>>n;

if(n<=0)

cout<<"输入错误!

";

else

loop(n,count);

}

六、

输入正整数k,找到所有的正整数x≥y,使得1/k=1/x+1/y。

1.解题思路:

对式子化简求得表达式,然后穷举得出结论。

2.源代码:

#include

usingnamespacestd;

intmain()

{

intk,x,y;

cout<<"请输入k:

";

cin>>k;

for(x=(k+1);x<=2*k;x++)

{

y=(k*x)/(x-k);

if((k*x)%(x-k)==0)

{

y=(k*x)/(x-k);

cout<<"1/"<

cout<<"x="<

cout<<"y="<

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1