版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 代码设计(满分5分)625这个数字很特别,625的平方等于,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:625代码:#includeusing namespace std;int shousan(int n) return n%1000;/得到后三位int main()for(int i=100;i=999;i+) if(i=shousan(i*i) coutiendl; return 0;运行结果:2. 代码设计(满分11分)考虑
2、方程式:a3 + b3 = c3 + d3其中:“”表示乘方。a、b、c、d是互不相同的小于30的正整数。这个方程有很多解。比如:a = 1,b=12,c=9,d=10 就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729。当然,a=12,b=1,c=9,d=10 显然也是解。如果不计abcd交换次序的情况,这算同一个解。你的任务是:找到所有小于30的不同的正整数解。把a b c d按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为:1,9,10,12不同解间的顺序可以不考虑。代码:#include using namespace std;#i
3、ncludeint main() int a,b,c,d;for(a=1;a30;a+) for(b=a+1;b30;b+) for(c=b+1;c30;c+) for(d=c+1;d30;d+) if(b*b*b+c*c*c=a*a*a+d*d*d) couta b c dendl; return 0;运行结果:代码设计(满分18分)整数的分划问题。 如,对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1+1 现在的问题是,对于给定的正整数n,编写算法打印所有划分
4、。用户从键盘输入 n (范围110)程序输出该整数的所有划分。整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+.+mi; (其中mi为正整数,并且1 = mi = n),则m1,m2,.,mi为n的一个划分。如果m1,m2,.,mi中的最大值不超过m,即max(m1,m2,.,mi)0),只有一种划分即1;(2)当m=1时,不论n的值为多少,只有一种划分即n个1,1,1,1,.,1;(3)当n=m时,根据划分中是否包含n,可以分为两种情况:(a)划分中包含n的情况,只有一个即n;(b)划分中不包
5、含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。因此 f(n,n) =1 + f(n,n-1);(4)当nm时,根据划分中是否包含最大值m,可以分为两种情况: (a)划分中包含m的情况,即m, x1,x2,.xi, 其中x1,x2,. xi 的和为n-m,因此这情况下为f(n-m,m)(b)划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);第五种情况中为划分中最大的整数不超过m,而不超过m则有两种情况,一种是划分中有m,此时剩下的则为n-m,那么相当于对n-m进行划分,并且划分中的最大整数不超过m;另一种情况为不包含m,那么最大
6、整数位m-1,相当于对n进行划分,最大整数不超过m-1.因此 f(n, m) = f(n-m, m)+f(n,m-1); 综上所述: f(n, m)=1;(n=1 or m=1) f(n,m)=f(n, n);(nm)划分个数代码:#include using namespace std;int f(int n,int m) if(n=1|m=1) return 1; else if(nn; coutf( n, n) ; return 0;划分情况代码:#include using namespace std;void f (int n, int a, int k)if(n=0)for(int
7、 i=0;ik;i+)coutai ;cout0;j-)if(k0 & jak-1)continue;ak=j; f(n-j,a,k+1); int main()int a1000;f(10,a,0);return 0;3、 代码设计(满分20分)一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。例如:当N=3时,153就满足条件,因为 13 + 53 + 33 = 153,这样的数字也被称为水仙花数(其中,“”表示乘方,53表示5的3次方,也就是立方)。当N=4时,1634满足条件,因为 14 + 64 + 34 + 44 = 1634。当N=5时,9
8、2727满足条件。实际上,对N的每个取值,可能有多个数字满足条件。程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。5程序设计(满分15分)从键盘输入一个整数(120)则以该数字为矩阵的大小,把1,2,3n*n 的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:1 24 3输入数字3,则程序输出:1 2 38 9 47 6 5输入数字4, 则程序输出:1 2
9、 3 412 13 14 511 16 15 610 9 8 7代码:#include using namespace std;#include int main()int a2121;int n,i=1,j=1,num=1; int s=0,x=0,z=0,y=1;/方位上s下x左z右y cinn; int b=n,b1=1;/步数5 4 4 3 3 2 2 1 1while(1) if(num=n*n+1) break; if(y=1) for(int i1=0;i1b;i1+) aij=num; j+; num+; b1+; if(b1=2) b-;b1=0;/是否修改步长 x=1; y
10、=0;/右转下 i+; j-;/校正位置 if(x=1) for(int i1=0;i1b;i1+) aij=num; i+; num+; b1+; if(b1=2) b-;b1=0; z=1; x=0; j-; i-; if(z=1) for(int i1=0;i1b;i1+) aij=num; j-; num+; b1+; if(b1=2) b-;b1=0; s=1; z=0; i-; j+; if(s=1) for(int i1=0;i1b;i1+) aij=num; i-; num+; b1+; if(b1=2) b-;b1=0; y=1; s=0; j+; i+; for(i=1;i
11、=n;i+) for(j=1;j=n;j+) printf(%-4d,aij); coutendl; return 0;运行结果:6程序设计(满分9分)从键盘输入一个日期,格式为yyyy-M-d要求计算该日期与1949年10月1日距离多少天例如:用户输入了:1949-10-2程序输出:1用户输入了:1949-11-1 12 1 1 1程序输出:31 30 31代码:输入1949年10月以后的日期#include using namespace std;#includeint main() int y,m,d,sum=0; char a,b; cinyambd; for(int i=1950;i
12、y;i+) if(i%400=0|(i%4=0&i%100!=0) sum+=366; else sum+=365; if(y=1949) for(int i=10;im;i+) if(i=10) sum+=31; if(i=11) sum+=30; sum=d+sum-1; else sum=sum+91+d; for(int i=1;i2) sum+=1; coutsum;return 0;7程序设计(满分20分)任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述
13、过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:82962, 75933, 63954, 61974 这个循环圈。请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 0,这个可以不考虑。循环圈的输出格式仿照:82962, 75933, 63954, 61974其中数字的先后顺序可以不考虑。代码:#include #includeusing namespace std;#includeint b12=0,bi=0;/保存循环圈中的数避免重复int chongzhu(int n)/返回差 int
14、a5,sum1=0,sum2=0,sum3; for(int i=0;i5;i+) ai=n%10; n/=10; sort(a,a+5); for(int i=0;i5;i+) sum1=sum1*10+ai; sum2=sum2*10+a4-i; sum3=sum2-sum1; if(sum3=0) return 0; while(sum310000)/补零 sum3*=10; return sum3;void heidong(int n) int a6,booll=0; a0=n; for(int i=1;i6;i+) ai=chongzhu(ai-1); for(int j=0;ji;
15、j+) if(ai=aj) for(int ii=0;ii12;ii+)/查重 if(ai=bii) booll=1; if(booll=1) break; coutaj; bbi=aj;bi+; for(int ij=j+1;iji;ij+) cout,aij; bbi=aij;bi+; coutendl; if(booll=1) break; if(ai=0) break; int main() for(int i=50000;i99999;i+) heidong(i); return 0;运行结果:8程序设计(满分 9 分)当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以
16、不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。该校验的过程:1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。3、将奇数位总和加上偶数位总和,结果应该可以被10整除。例如,卡号是:88881则奇数、偶数位(用红色标出)分布:88881奇数位和=35偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。最后35+35=70 可以被10整除,认定校验通过。请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:
17、“成功”,否则显示“失败”。比如,用户输入:2780程序输出:成功代码:#include using namespace std;#includeint main() string s; cins; int a100,b=1,sum=0; for(int i=0;si!=0;i+) ab=si-0; b+; if(b%2=0)/第一个是奇数位 for(int i=1;i9) ai-=9; sum+=ai; else/第一个是偶数位 for(int i=1;i9) ai-=9; sum+=ai; if(sum%10=0)cout成功endl; else cout失败endl;return 0;运
18、行结果:第八次作业1. 空瓶换汽水浪费可耻,节约光荣。饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料。刚好小明前两天买了2瓶该饮料喝完了,瓶子还在。他耍了个小聪明,向老板借 了一个空瓶,凑成3个,换了一瓶该饮料,喝完还瓶!饮料店老板一统计,已经售出该饮料且未还瓶的有12345瓶,那么如果这些饮料的买主都如小明一样聪明,老板最多还需要送出多少瓶饮料呢?显然答案是个正整数。算法分析:这就相当于两瓶换一瓶,结果是12345/2=6172.代码设计:#includeusing namespace std;int main()int ping;cinping;coutping/2;re
19、turn 0;运行结果:2. 三人年龄三个神秘蒙面人来访F博士。博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁。我们3人年龄总和为岁。且我们三人年龄的乘积是所有可能情况中最大的。请帮助F博士计算他们的年龄,从小到大排列,用逗号分开。算法分析:通过最小的不超过19和所有可能中三人乘积最大可以知道最小的19岁,其余两个人合为51,遍历找到乘积最大的那对组合即可。代码设计:#includeusing namespace std;int main()int sum,j;sum=51;for(int i=1;i=51/2;i+) if(sumi*(51-i) sum=i*(51-i); j=i
20、; cout19 j 51-j ;return 0;运行结果:3. 考察团组成某饭店招待国外考察团。按照标准,对领导是400元/人,随团职员200元/人,对司机50元/人。考察团共36人,招待费结算为3600元,请问领导、职员、司机各几人。答案是三个整数,用逗号分隔。代码设计:#includeusing namespace std;int main()for(int a=1;a8;a+) for(int b=1;b(3600-(400*a)/200;b+) int c; c=36-a-b; if(c*50+b*200+a*400=3600) couta,b,c; break; return 0
21、;运行结果:4. 微生物增殖假设有两种微生物 X 和 YX出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。如果X=10,Y=90 呢?本题的要求就是写出这两种初始条件下,60分钟后Y的数目。题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草! 请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!两个整数,每个1行。代码设计:#incl
22、udeusing namespace std;int main()int x,y;cinxy;for(int i=1;i=120;i+) if(i%4=0) y*=2; if(i%6=0) x*=2; if(i%2=1) y-=x; /x吃了X个Ycouty;return 0;运行结果:5. 除去次方数自然数的平方数是:1 4 9 16 25 自然数的立方数是:1 8 27 64 125 自然数的4次方数是:1 16 81 256 这些数字都可以称为次方数。110000中,去掉所有的次方数,还剩下多少个数字?代码设计:#includeusing namespace std;int main()
23、int a10000,sum=0;memset(a,0,sizeof(int)*10000);/初始化数组容器for(int i=1;i=100;i+)/找出所有的二次方 ai*i=i;for(int j=1;j10000;j+) if(aj!=0) if(j*aj10000) aj*aj=aj;/数组不为零时算出对应数的下一个次方 else sum+; /为零时不为次方数coutsum;return 0;运行结果:6. 正六面体染色正六面体用4种颜色染色。共有多少种不同的染色样式?要考虑六面体可以任意旋转、翻转。算法分析:根据伯恩赛德引理,用n颜色染正六面体的所有染色样式有:(pow(n,6
24、)+pow(n,4)*3+pow(n,3)*12+8*n*n)/24。代码设计:#include#include#includeusing namespace std;int f(int n) return (pow(n,6)+pow(n,4)*3+pow(n,3)*12+8*n*n)/24;int main() int n; cinn; coutf(n); return 0;7. 古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是
25、没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。 答案写在“解答.txt”中,不要写在这里!算法分析:递归赋值代码设计:#includeusing namespace std;int add1(int a5)/求和 int sum=0,i=4; while(i=0) sum=sum*10+ai; i-; return sum;int add2(int a5)/逆向求和 int sum=0,i=0; while(i=4) sum=sum*10+ai; i+; return sum;bool p(int a5,int n)/判断是不是各不同 fo
26、r(int i=0;isum2) if(sum1%sum2=0) coutsum2; else for(int i=1;i=9;i+) an=i; if(p(a,n) f(a,n+1); int main() int a5; f(a,0); return 0;运行结果:8. 海盗比酒量有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复. 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“.昨天,我正好喝了一瓶.
27、奉劝大家,开船不喝酒,喝酒别开船.”请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人没倒下。如果有多个可能的答案,请列出所有答案,每个答案占一行。格式是:人数,人数,.例如,有一种可能是:20,5,4,2,0多个答案排列顺序不重要。答案写在“解答.txt”中,不要写在这里!参考答案:18,9,3,2,0 (1分)15,10,3,2,0 (2分)20,5,4,2,0 (0分)12,6,4,2,0 (2分)代码设计:#include using namespace std;int main() int a,b,c,d; for(a=20;a0;a-) for(b=a-1;b0;b-)/满
28、足人越来越少 for(c=b-1;c0;c-) for(d=c-1;d0;d-) if(a*b*c*d=a*b*c+b*c*d+c*d*a+a*b*d)/同分的结果 couta,b,c,d,0endl; return 0;运行结果:9. 奇怪的比赛某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
29、如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如: 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。多个答案顺序不重要。答案写在“解答.txt”中,不要写在这里!递归代码:#include using namespace std;int num11;void f(int sum,int n) if(n=11) if(sum=100) for(int i=1;i11;i+) coutnumi; coutendl; else numn=0; f(sum-n,n+1); numn=1; f(sum*2,n+1); int main() f(10,
30、1);return 0;运行结果: 10. 土地测量造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比如是如图【1.jpg】中所示的五边形。一般需要把它划分为多个三角形来计算。已知三边求三角形的面积需要用海伦定理,参见【2.jpg】各条边长数据如下:AB = 52.1BC = 57.2CD = 43.5DE = 51.9EA = 33.4EB = 68.2EC = 71.9根据这些数据求五边形地块的面积。四舍五入到小数后两位。只写结果,不要源代码!答案写在“解答.txt”中,不要写在这里!图1图2代码设计:#include#incl
31、ude#includeusing namespace std;float f(float a,float b,float c) float sum=(a+b+c)/2; return sqrt(sum*(sum-a)*(sum-b)*(sum-c);int main() float AB = 52.1,BC = 57.2,CD = 43.5,DE = 51.9; float EA = 33.4,EB = 68.2,EC = 71.9,sum=0; sum=f(AB,EA,EB)+f(EB,EC,BC)+f(EC,CD,DE); printf(%.2f,sum); return 0;运行结果:1
32、1. 欧拉与鸡蛋大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。欧拉随便问:“卖了多少鸡蛋呢?”不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!”欧拉猜不出。另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。欧拉想了想,说出了正确答案。算法分析:假设分别有想X,个,由描述可列出:,;解方程即可。代码设计:#include#includeusing namespace std;int main() int i,j; for(i
33、=1;i=100;i+) j=150-i; if(i*i*245=j*j*320) couti,j; break; return 0;运行结果: 12. 巧排扑克牌小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:他手里握着一叠扑克牌:A,2,.J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;.如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9
34、,10,J,Q,K请你计算一下,小明最开始的时候手里牌的顺序是怎样的。把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。大数学家考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!回去试试!算法分析:这是一个典型的约瑟夫环问题,不过是逆向的环,只需根据规律反向插入即可。代码实现:#include #include using namespace std;#includestruct huan int num; huan *next;int main() int a13; for(int ii=0;iinext
35、=p; p-next=head;/构成环 head-num=ai; i-; p-num=ai; i-; p1=head; p2=p;/前后指针 while(i=0) p=new huan; p-num=ai; i-; p1-next=p; p-next=p2;/插入 p1=p;/p1后移 p2=p2-next; p1=p1-next;/后移插入 p3=head;for(int b=0;bnum=10)/找到第一张牌10 break; p3=p3-next; for(int b=0;bnum=1) coutnum=11) coutnum=12) coutnum=13) coutK ; else
36、coutnumnext; return 0;运行结果:13. 排座位要安排:3个A国人,3个B国人,3个C国人坐成一排。要求不能使连续的3个人是同一个国籍。求所有不同方案的总数?算法分析:对9个人进行编号,将A数组全排列,然后判断是否符合。运行结果:#includeusing namespace std;bool p(int a9,int n)/判断一个国家的三个人是否挨着for(int i=0;ien)if(p(a,n) sum+;elsefor(int i=start;i=en;i+)char temp = ai;ai = astart;astart = temp;f(a,start+1,en);/ 递归temp = ai;ai = astart;astart = temp;int main()int a9=1,1,1,2,2,2,3,3,3;f(a,0,8);coutsum;return 0; 14. 黄金队列黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年注册化工工程师考试真题汇编精解
- 2026年土地估价师考试题及答案
- 2026年氧化工艺题库及解析
- 企业售后问题处理满意度调查问卷
- 哈药集团股份有限公司2026届春季校园招聘备考题库附完整答案详解(网校专用)
- 四川大学华西厦门医院耳鼻咽喉-头颈外科招聘1人备考题库附答案详解(a卷)
- 国泰君安期货2026届金衍新星SSP招募备考题库附答案详解(培优b卷)
- 国金证券2026届春季校园招聘备考题库附答案详解(满分必刷)
- 宁银理财2026届春季校园招聘备考题库附完整答案详解【网校专用】
- 汉江实验室2026届校园招聘备考题库带答案详解(突破训练)
- 240kV及以上变电站运行管理标准
- 《环保知识培训》课件
- 脊柱结核护理查房
- 英汉互译单词练习打印纸
- 供应商稽核查检表
- DB4403-T 238-2022 酒店式公寓经营服务规范
- 保育员-生活管理-健康观察课件
- 2023浙江工业大学机械原理习题答案
- 中国铁塔股份有限公司代维单位星级评定方案2017年
- 江苏如东1100MW海上风电项目陆上换流站工程环评报告
- 江苏省无锡市江阴市2023年事业单位考试A类《职业能力倾向测验》临考冲刺试题含解析
评论
0/150
提交评论