问题求解 作业.docx
《问题求解 作业.docx》由会员分享,可在线阅读,更多相关《问题求解 作业.docx(17页珍藏版)》请在冰豆网上搜索。
问题求解作业
一、找规律
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="<}
}
}