1、高难度算法高难度算法 1、歌星大奖赛 在歌星大奖赛中,有 10个评委为参赛的选手打分,分数为 1-100分。选手最后得分为:去掉一个最高分和一个最低分后其余 8个分数的平均值。请编写一个程序实现。#include#include void main()int i,a,min=100,max=0,sum=0;float aver;for(i=0;ia)min=a;if(maxa)max=a;sum+=a;aver=(float)(sum-max-min)/8;printf(Cancled max score:%dnCancled min:score%dnAverage score:%4.2fn,
2、max,min,aver);2、高次方数的尾数 求 13的 13 次方的最后三位数。#include#include void main()int x,y,i,last=1;printf(Input X and Y(X*Y):);scanf(%d*%d,&x,&y);for(i=0;iy;i+)last=x*(last%1000);/取数的最后 3位,即用它整除 1000,得到余数 last=last%1000;/别忘了这里还要处理一下 printf(The last 3 digits of%d*%d is:%dn,x,y,last%1000);3、阶乘尾数零的个数 100!的尾数有多少个零?
3、#include#include void main()int a,count=0;for(a=5;a=100;a+=5)/循环从 5开始,以 5的倍数为步长,考察整数 +count;/若为 5 的倍数,计数器加 1 if(!(a%25)+count;/若为 25的倍数,计数器再加 1 printf(The number of 0 in the end of 100!is:%d.n,count);/打印结果 4、借书方案知多少 小明有五本新书,要借给 A,B,C 三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?#include#include void main()int a,b,
4、c,count=0;printf(There are diffrent methods for Xiao Ming to distribute books to 3 readers:n);for(a=1;a=5;a+)/穷举第一个人借 5本书中的 1本的全部情况 for(b=1;b=5;b+)/穷举第二个人借 5本书中的一本的全部情况 for(c=1;a!=b&c12)/判断输入数据是否超过 12 scanf(%d,&n);/控制输入正确的值以保证屏幕显示的图形正确 if(n12)printf(Input a integer less than 13,N=);for(i=0;i=n;i+)/控
5、制输出 N行 for(k=0;k24-2*i;k+)printf(+);/控制输出第 i 行前面的空格 for(j=1;ji+2;j+)printf(%4d,c(i,j);/输出第 i 行的值 printf(n);int c(int x,int y)/求杨辉三角形中第 x 行第 y列的值 int z;if(y=1)|(y=x+1)return 1;/若为 x 行的第 1 或第 x+1 列,则输出 1 else z=c(x-1,y-1)+c(x-1,y);/否则,其值为前一行中第 y-1 列与第 y列值之和 return z;6、打鱼还是晒网 中国有句俗语叫“三天打鱼两天晒网”。某人从 1990
6、 年 1月 1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。#include struct date int year;int month;int day;int days(struct date day);void main()struct date today,term;int yearday,year,day;printf(Enter year/month/day:);scanf(%d%d%d,&today.year,&today.month,&today.day);/输入日期 term.month=12;/设置变量的初始值:月 term.day=31;/
7、设置变量的初始值:日 for(yearday=0,year=1990;year0&day4)printf(He was fishing at that day.n);/打印结果 else printf(He was sunning his net at that day.n);int days(struct date day)static int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,/每月的天数 0,31,29,31,30,31,30,31,31,30,31,30,31,;int i,lp;lp=day.year%4=0&day.y
8、ear%100!=0|day.year%400=0;/判定 year 为闰年还是平年,lp=0为平年,非 0 为闰年 for(i=1;iday.month;i+)/计算本年中自 1 月 1日起的天数 day.day+=day_tablpi;return day.day;7、抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。#include void main()int i,j,k,c;
9、for(i=1;i=9;i+)/i:车号前二位的取值 for(j=0;j=9;j+)/j:车号后二位的取值 if(i!=j)/判断二位数字是否相异 k=i*1000+i*100+j*10+j;/计算出可能的整数 for(c=31;c*ck;c+);/判断该数是否为另一整数的平方 if(c*c=k)printf(Lorry No.is%d.n,k);/若是,打印结果 8、该存多少钱 假设银行一年整存零取的月息为 0.63%。现在某人手中有一笔钱,他打算在今后的五年中的年底取出 1000 元,到第五年时刚好取完,请算出他存钱时应存入多少。#include void main()int i;doub
10、le saving=0;for(i=1;i=5;i+)/i 为年数,取值为 1-5 年 saving=(saving+1000)/(1+0.0063*12);/累计算出年初存款数额,第五次的计算结果即为题解 printf(He must save%.2f at first.n,saving);9、怎样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为:0.63%期限=1 年 0.66%期限=2 年 0.69%期限=3 年 0.75%期限=5 年 0.84%期限=8 年 利息=本金*月息利率*12*存款年限。现在某人手中有 2000 元钱,请通过计算选择一种存钱方案,使得钱存入银行 20年
11、后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。#include#include void main()int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;double max=0,term;for(i8=0;i83;i8+)/4 个 for循环穷举所有可能的存款方式 for(i5=0;i5=(20-8*i8)/5;i5+)for(i3=0;i3=(20-8*i8-5*i5)/3;i3+)for(i2=0;i2max)max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;printf(For maxinum profit,he shou
12、ld so save his money in a bank:n);printf(made fixed deposit for 8 year:%d timesn,n8);printf(made fixed deposit for 5 year:%d timesn,n5);printf(made fixed deposit for 3 year:%d timesn,n3);printf(made fixed deposit for 2 year:%d timesn,n2);printf(made fixed deposit for 1 year:%d timesn,n1);printf(Tota
13、l money:%.2f Yuan.n,max);10、捕鱼和分鱼 A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三竿,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E 依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?#include void main()int n,i,x,flag=1;/*flag:控制标记*/for(n=6;flag;n+)/*采用试探的方法。令试探值 n逐步加大*/for(x=n,i=1;flag&i=5;i+)i
14、f(x-1)%5=0)x=4*(x-1)/5;else flag=0;/*若不能分配则置标记 falg=0 退出分配过程*/if(flag)break;/*若分配过程正常结束则找到结果退出试探的过程*/else flag=1;/*否则继续试探下一个数*/printf(Total number of fish catched=%dn,n);/*输出结果*/11、出售金鱼 买买提将养的一缸金鱼分五次出售:第一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的 11 条。问原来的鱼缸中共有几条
15、金鱼?#include void main()int i,j,flag=0,x;/flag为标志变量 for(i=23;flag=0;i+=2)/控制试探的步长和过程 for(j=1,x=i;j=11;j+)/完成出售四次的操作,j 为卖的次数 if(x+1)%(j+1)=0)/若满足整除条件则进行实际的出售操作 x-=(x+1)/(j+1);else x=0;break;/否则停止计算过程,跳至上一层 for循环 if(j=5&x=11)/若第四次余下 11条则满足题意 printf(There are%d fishes at first.n,i);/输出结果 flag=1;/控制退出试探过
16、程 12、除不尽的自然数 一个自然数被 8除余 1,所得的商被 8除也余 1,再将第二次的商被 8除后余 7,最后得到一个商为 a。又知这个自然数被 17除余 4,所得的商被 17除余 15,最后得到一个商是 a的 2 倍。求这个自然数。#include void main()int i;for(i=0;i+)/*试探商的值*/if(i*8+7)*8+1)*8+1=(34*i+15)*17+4)printf(The required number is:%dn,(34*i+15)*17+4);break;13、一个奇异的三位数 一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是
17、一个三位数,且这两个三位数的数码正好相反,求这个三位数。#include void main()int i,j,k;/因为要交换位置,所以 i 和 k不能为 0 for(i=1;i7;i+)/穷举九进制的第一位数字 for(j=0;j7;j+)/穷举九进制的第二位数字 for(k=1;k7;k+)/穷举九进制的第三位数字 if(i*9*9+j*9+k=i+j*7+k*7*7)printf(The special number with 3 digits is:);printf(%d%d%d(7)=%d%d%d(9)=%d(10)n,k,j,i,i,j,k,i*9*9+j*9+k);14、4 位
18、反序数 设 N是一个四位数,它的 9 倍恰好是其反序数,求 N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是 4321。#include void main()int i;for(i=1002;i1111;i+)/初始值不必设为 1000 或 1001,因为 1000 个位是 0,1001的反序数还是 1001。/判断条件设为 1111 的理由是 1112*9=10008,是个五位数。if(i%10*1000+i/10%10*100+i/100%10*10+i/1000=i*9)/*判断反序数是否是原数的 9 倍*/printf(The number satisfied s
19、tats condition is:%dn,i);15、求车速(08年高考题)一辆以固定速度行驶的汽车,司机在上午 10 点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为 95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?#include void main()int t,a5;/数组 a5存放分解的数字位 long int k,i;for(i=95860;i+)/以 95860为初值,循环试探 for(t=0,k=100000;k=10;t+)/从高位到低位分解 i 的每位数字,依次存放于 a0-a5中 at=(i%k)
20、/(k/10);k/=10;if(a0=a4)&(a1=a3)printf(The new symmetrical number kelometers is:%d%d%d%d%dn,a0,a1,a2,a3,a4);printf(The velocity of the car is:%.2fn,(i-95859)/2.0);break;16、由两个平方三位数获得三个平方二位数 已知两个平方三位数 abc和 xyz,其中 a、b、c、x、y、z 未必是不同的;而 ax、by、cz 是三个平方二位数。请编程求三位数 abc和 xyz。#include#include void main()void
21、f(int n,int*s);int i,t;int a3,b3;printf(The possible perfect squares combinations are:n);for(i=10;i=31;+i)/穷举平方三位数的取值范围 for(t=10;t=10)&/检验新构成的数是否是两位数,是否是平方数 (a1*10+b1=10)&(a2*10+b2=10)&sqrt(a0*10+b0)=(int)sqrt(a0*10+b0)&sqrt(a1*10+b1)=(int)sqrt(a1*10+b1)&sqrt(a2*10+b2)=(int)sqrt(a2*10+b2)printf(%d a
22、nd%d.n,i*i,t*t);17、亲密数 如果整数 A的全部因子(包括 1,不包括 A本身)之和等于 B;且整数 B的全部因子(包括 1,不包括 B本身)之和等于 A,则将整数 A和 B称为亲密数。求 3000以内的全部亲密数。#include void main()printf(There are following friendlynumbers pair smaller than 3000:n);int a,b,i,t;for(a=1;a=3000;a+)/穷举 3000 以内的全部整数 b=0;for(i=1;i=a/2;i+)/计算 a的因子,并将各因子依次累加于 b中 if(!
23、(a%i)b=b+i;t=0;for(i=1;ia)printf(%4d.%-4dn,a,b);/若 a与 b不同,且 t=a,则 a与b 一对亲密数,输出 18、自守数 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25*25=625 76*76=5776 9376*9376=87909376 请求出 200000以内的自守数。#include void main()int i,j,k,l;for(i=0;i0;k-)l=10*l;if(i=(i*i)%l)printf(%5d,i);printf(n);19、回文数 打印所有不超过 n(取 n256)的其平方具有对称性质的数(也称
24、回文数)。#include void main()int i,n,a,m16,k,count=0,t;printf(No.number its square(palindrome)n);for(n=1;n=1;i-)k+=mi-1*t;t=t*10;if(k=n*n)printf(%2d%12d%12dn,+count,n,n*n);20、求具有 abcd=(ab+cd)*(ab+cd)性质的四位数 3025这个数具有一种独特的性质:将它平分为二段,即 30和 25,使之相加后求平方,即(30+25)2,恰好等于 3025本身。请求出具有这样性质的全部四位数。#include void mai
25、n()int n,a,b;printf(There are following number with 4 digits satisfied conditionn);for(n=1000;n=9999;n+)/四位数 N的取值范围 1000-9999 a=n/100;/截取 N 的前两位数存于 a b=n%100;/截取 N的后两位存于 b if(n=(a+b)*(a+b)printf(%dn,n);/判断 n是否为符合题目所规定的性质的四位数,如果是,输出 21、可逆素数 求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。22、回文素数 求不超过 1000的
26、回文素数。23、马克思手稿中的数学题 马克思手稿中有一道趣味数学问题:有 30 个人,其中有男人、女人和小孩,在一家饭馆吃饭花了 50先令;每个男人花 3先令,每个女人花 2先令,每个小孩花 1先令;问男人、女人和小孩各有几人?#include void main()int x,y,z,count=0;printf(Men Women Childrenn);printf(n);for(x=0;x=10;x+)y=20-2*x;/x 定值据(3)式求 y z=30-x-y;/由(1)式求得 if(3*x+2*y+z=50)/当前得到的一组解是否满足式(2)printf(%2d:%2d%6d%7d
27、n,+count,x,y,z);24、新娘和新郞 三对情侣参加婚礼,三个新郞为 A、B、C,三个新娘为 X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A 说他将和 X结婚;X说她的未婚夫是 C;C 说他将和 Z结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。#include void main()int x,y,z;for(x=1;x=3;x+)/穷举 x 的全部可能配偶 for(y=1;y=3;y+)/穷举 y的全部可能配偶 for(z=1;z=3;z+)/穷举 z 的全部可能配偶 if(x!=1&x!=3&z!=3&x!=y&x!=z
28、&y!=z)/判断配偶是否满足题意 printf(X will marry to%c.n,A+x-1);/打印判断结果 printf(Y will marry to%c.n,A+y-1);printf(Z will marry to%c.n,A+z-1);25、委派任务 某侦察队接到一项紧急任务,要求在 A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:1)A和 B两人中至少去一人;2)A和 D不能一起去;3)A、E和 F三人中要派两人去;4)B和 C 都去或都不去;5)C和 D两人中去一个;6)若 D不去,则 E 也不去。问应当让哪几个人去?#include void m
29、ain()int a,b,c,d,e,f;for(a=1;a=0;a-)/穷举每个人是否去的所有情况 for(b=1;b=0;b-)/1:去 0:不去*/for(c=1;c=0;c-)for(d=1;d=0;d-)for(e=1;e=0;e-)for(f=1;f=0;f-)if(a+b=1&a+d!=2&a+e+f=2&(b+c=0|b+c=2)&c+d=1&(d+e=0|d=1)printf(A will%s be assigned.n,a?:not);printf(B will%s be assigned.n,b?:not);printf(C will%s be assigned.n,c?
30、:not);printf(D will%s be assigned.n,d?:not);printf(E will%s be assigned.n,e?:not);printf(F will%s be assigned.n,f?:not);26、谁在说谎 张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话?#include void main()int a,b,c;for(a=0;a=1;a+)for(b=0;b=1;b+)for(c=0;c=1;c+)if(a&!b|!a&b)&(b&!c|!b&c)&(c&a+b=0|!c&a+b!
31、=0)printf(Zhangsan told a%s.n,a?truth:lie);printf(Lisi told a%s.n,b?truch:lie);printf(Wangwu told a%s.n,c?truch:lie);27、谁是窃贼 公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷,是丙偷的。”丙说:“甲没有偷,是乙偷的。”丁说:“我没有偷。”请根据这四人的答话判断谁是盗窃者。#include void main()int i,j,a4;for(i=
32、0;i4;i+)/假定只有第 i 个人为窃贼 for(j=0;j4;j+)/在第 i 轮假设中,假设第 i 个人为窃贼,把 ai设为 1,其余为 0 if(j=i)aj=1;else aj=0;if(a3+a1=1&a1+a2=1&a0+a1=1)/判断条件是否成立 printf(The thief is);/成立 for(j=0;j=3;j+)/输出计算结果 if(aj)printf(%c.,j+A);printf(n);28、黑与白 有 A、B、C、D、E五人,每人额头上都贴了一张黑或白的纸。五人对坐,每人都可以看到其它人额头上的纸的颜色。五人相互观察后,A说:“我看见有三人额头上贴的是白
33、纸,一人额头上贴的是黑纸。”B说:“我看见其它四人额头上贴的都是黑纸。”C 说:“我看见一人额头上贴的是白纸,其它三人额头上贴的是黑纸。”D说:“我看见四人额头上贴的都是白纸。”E什么也没说。现在已知额头上贴黑纸的人说的都是谎话,额头贴白纸的人说的都是实话。问这五人谁的额头是贴白纸,谁的额头是贴黑纸?#include void main()int a,b,c,d,e;for(a=0;a=1;a+)/黑色:0 白色:1 for(b=0;b=1;b+)/穷举五个人额头贴纸的全部可能 for(c=0;c=1;c+)for(d=0;d=1;d+)for(e=0;e=1;e+)if(a&b+c+d+e=3|!a&b+c+d+e!=3)&(b&a+c+d+e=0|!b&a+c+d+e!=0)&(c&a+b+d+e=1|!c&a+b+d+e!=1)&(d&a+b+c+e=4|!d&a+b+c+e!=4)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1