问题求解 作业.docx
- 文档编号:25973083
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:17
- 大小:17.80KB
问题求解 作业.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="< } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 问题求解 作业 问题 求解