高难度算法.docx

上传人:b****6 文档编号:7973307 上传时间:2023-01-27 格式:DOCX 页数:38 大小:33.97KB
下载 相关 举报
高难度算法.docx_第1页
第1页 / 共38页
高难度算法.docx_第2页
第2页 / 共38页
高难度算法.docx_第3页
第3页 / 共38页
高难度算法.docx_第4页
第4页 / 共38页
高难度算法.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

高难度算法.docx

《高难度算法.docx》由会员分享,可在线阅读,更多相关《高难度算法.docx(38页珍藏版)》请在冰豆网上搜索。

高难度算法.docx

高难度算法高难度算法1、歌星大奖赛在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1-100分。

选手最后得分为:

去掉一个最高分和一个最低分后其余8个分数的平均值。

请编写一个程序实现。

#include#includevoidmain()inti,a,min=100,max=0,sum=0;floataver;for(i=0;ia)min=a;if(maxa)max=a;sum+=a;aver=(float)(sum-max-min)/8;printf(Cancledmaxscore:

%dnCancledmin:

score%dnAveragescore:

%4.2fn,max,min,aver);2、高次方数的尾数求13的13次方的最后三位数。

#include#includevoidmain()intx,y,i,last=1;printf(InputXandY(X*Y):

);scanf(%d*%d,&x,&y);for(i=0;iy;i+)last=x*(last%1000);/取数的最后3位,即用它整除1000,得到余数last=last%1000;/别忘了这里还要处理一下printf(Thelast3digitsof%d*%dis:

%dn,x,y,last%1000);3、阶乘尾数零的个数100!

的尾数有多少个零?

#include#includevoidmain()inta,count=0;for(a=5;a=100;a+=5)/循环从5开始,以5的倍数为步长,考察整数+count;/若为5的倍数,计数器加1if(!

(a%25)+count;/若为25的倍数,计数器再加1printf(Thenumberof0intheendof100!

is:

%d.n,count);/打印结果4、借书方案知多少小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?

#include#includevoidmain()inta,b,c,count=0;printf(TherearediffrentmethodsforXiaoMingtodistributebooksto3readers:

n);for(a=1;a=5;a+)/穷举第一个人借5本书中的1本的全部情况for(b=1;b=5;b+)/穷举第二个人借5本书中的一本的全部情况for(c=1;a!

=b&c12)/判断输入数据是否超过12scanf(%d,&n);/控制输入正确的值以保证屏幕显示的图形正确if(n12)printf(Inputaintegerlessthan13,N=);for(i=0;i=n;i+)/控制输出N行for(k=0;k24-2*i;k+)printf(+);/控制输出第i行前面的空格for(j=1;ji+2;j+)printf(%4d,c(i,j);/输出第i行的值printf(n);intc(intx,inty)/求杨辉三角形中第x行第y列的值intz;if(y=1)|(y=x+1)return1;/若为x行的第1或第x+1列,则输出1elsez=c(x-1,y-1)+c(x-1,y);/否则,其值为前一行中第y-1列与第y列值之和returnz;6、打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网”。

某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

#includestructdateintyear;intmonth;intday;intdays(structdateday);voidmain()structdatetoday,term;intyearday,year,day;printf(Enteryear/month/day:

);scanf(%d%d%d,&today.year,&today.month,&today.day);/输入日期term.month=12;/设置变量的初始值:

月term.day=31;/设置变量的初始值:

日for(yearday=0,year=1990;year0&day4)printf(Hewasfishingatthatday.n);/打印结果elseprintf(Hewassunninghisnetatthatday.n);intdays(structdateday)staticintday_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,;inti,lp;lp=day.year%4=0&day.year%100!

=0|day.year%400=0;/判定year为闰年还是平年,lp=0为平年,非0为闰年for(i=1;iday.month;i+)/计算本年中自1月1日起的天数day.day+=day_tablpi;returnday.day;7、抓交通肇事犯一辆卡车违反交通规则,撞人后逃跑。

现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。

甲说:

牌照的前两位数字是相同的;乙说:

牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:

四位的车号刚好是一个整数的平方。

请根据以上线索求出车号。

#includevoidmain()inti,j,k,c;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(LorryNo.is%d.n,k);/若是,打印结果8、该存多少钱假设银行一年整存零取的月息为0.63%。

现在某人手中有一笔钱,他打算在今后的五年中的年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少。

#includevoidmain()inti;doublesaving=0;for(i=1;i=5;i+)/i为年数,取值为1-5年saving=(saving+1000)/(1+0.0063*12);/累计算出年初存款数额,第五次的计算结果即为题解printf(Hemustsave%.2fatfirst.n,saving);9、怎样存钱利最大假设银行整存整取存款不同期限的月息利率分别为:

0.63%期限=1年0.66%期限=2年0.69%期限=3年0.75%期限=5年0.84%期限=8年利息=本金*月息利率*12*存款年限。

现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。

#include#includevoidmain()inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;doublemax=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(Formaxinumprofit,heshouldsosavehismoneyinabank:

n);printf(madefixeddepositfor8year:

%dtimesn,n8);printf(madefixeddepositfor5year:

%dtimesn,n5);printf(madefixeddepositfor3year:

%dtimesn,n3);printf(madefixeddepositfor2year:

%dtimesn,n2);printf(madefixeddepositfor1year:

%dtimesn,n1);printf(Totalmoney:

%.2fYuan.n,max);10、捕鱼和分鱼A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。

日上三竿,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。

B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。

C、D、E依次醒来,也按同样的方法拿走鱼。

问他们合伙至少捕了多少条鱼?

#includevoidmain()intn,i,x,flag=1;/*flag:

控制标记*/for(n=6;flag;n+)/*采用试探的方法。

令试探值n逐步加大*/for(x=n,i=1;flag&i=5;i+)if(x-1)%5=0)x=4*(x-1)/5;elseflag=0;/*若不能分配则置标记falg=0退出分配过程*/if(flag)break;/*若分配过程正常结束则找到结果退出试探的过程*/elseflag=1;/*否则继续试探下一个数*/printf(Totalnumberoffishcatched=%dn,n);/*输出结果*/11、出售金鱼买买提将养的一缸金鱼分五次出售:

第一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。

问原来的鱼缸中共有几条金鱼?

#includevoidmain()inti,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);elsex=0;break;/否则停止计算过程,跳至上一层for循环if(j=5&x=11)/若第四次余下11条则满足题意printf(Thereare%dfishesatfirst.n,i);/输出结果flag=1;/控制退出试探过程12、除不尽的自然数一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。

又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。

求这个自然数。

#includevoidmain()inti;for(i=0;i+)/*试探商的值*/if(i*8+7)*8+1)*8+1=(34*i+15)*17+4)printf(Therequirednumberis:

%dn,(34*i+15)*17+4);break;13、一个奇异的三位数一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。

#includevoidmain()inti,j,k;/因为要交换位置,所以i和k不能为0for(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(Thespecialnumberwith3digitsis:

);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位反序数设N是一个四位数,它的9倍恰好是其反序数,求N。

反序数就是将整数的数字倒过来形成的整数。

例如:

1234的反序数是4321。

#includevoidmain()inti;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(Thenumbersatisfiedstatsconditionis:

%dn,i);15、求车速(08年高考题)一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。

两小时后里程表上出现了一个新的对称数。

问该车的速度是多少?

新的对称数是多少?

#includevoidmain()intt,a5;/数组a5存放分解的数字位longintk,i;for(i=95860;i+)/以95860为初值,循环试探for(t=0,k=100000;k=10;t+)/从高位到低位分解i的每位数字,依次存放于a0-a5中at=(i%k)/(k/10);k/=10;if(a0=a4)&(a1=a3)printf(Thenewsymmetricalnumberkelometersis:

%d%d%d%d%dn,a0,a1,a2,a3,a4);printf(Thevelocityofthecaris:

%.2fn,(i-95859)/2.0);break;16、由两个平方三位数获得三个平方二位数已知两个平方三位数abc和xyz,其中a、b、c、x、y、z未必是不同的;而ax、by、cz是三个平方二位数。

请编程求三位数abc和xyz。

#include#includevoidmain()voidf(intn,int*s);inti,t;inta3,b3;printf(Thepossibleperfectsquarescombinationsare:

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(%dand%d.n,i*i,t*t);17、亲密数如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。

求3000以内的全部亲密数。

#includevoidmain()printf(Therearefollowingfriendlynumberspairsmallerthan3000:

n);inta,b,i,t;for(a=1;a=3000;a+)/穷举3000以内的全部整数b=0;for(i=1;i=a/2;i+)/计算a的因子,并将各因子依次累加于b中if(!

(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=62576*76=57769376*9376=87909376请求出200000以内的自守数。

#includevoidmain()inti,j,k,l;for(i=0;i0;k-)l=10*l;if(i=(i*i)%l)printf(%5d,i);printf(n);19、回文数打印所有不超过n(取n256)的其平方具有对称性质的数(也称回文数)。

#includevoidmain()inti,n,a,m16,k,count=0,t;printf(No.numberitssquare(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本身。

请求出具有这样性质的全部四位数。

#includevoidmain()intn,a,b;printf(Therearefollowingnumberwith4digitssatisfiedconditionn);for(n=1000;n=9999;n+)/四位数N的取值范围1000-9999a=n/100;/截取N的前两位数存于ab=n%100;/截取N的后两位存于bif(n=(a+b)*(a+b)printf(%dn,n);/判断n是否为符合题目所规定的性质的四位数,如果是,输出21、可逆素数求四位的可逆素数。

可逆素数指:

一个素数将其各位数字的顺序倒过来构成的反序数也是素数。

22、回文素数求不超过1000的回文素数。

23、马克思手稿中的数学题马克思手稿中有一道趣味数学问题:

有30个人,其中有男人、女人和小孩,在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?

#includevoidmain()intx,y,z,count=0;printf(MenWomenChildrenn);printf(n);for(x=0;x=10;x+)y=20-2*x;/x定值据(3)式求yz=30-x-y;/由

(1)式求得if(3*x+2*y+z=50)/当前得到的一组解是否满足式

(2)printf(%2d:

%2d%6d%7dn,+count,x,y,z);24、新娘和新郞三对情侣参加婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。

有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:

A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。

这人听后知道他们在开玩笑,全是假话。

请编程找出谁将和谁结婚。

#includevoidmain()intx,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&y!

=z)/判断配偶是否满足题意printf(Xwillmarryto%c.n,A+x-1);/打印判断结果printf(Ywillmarryto%c.n,A+y-1);printf(Zwillmarryto%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也不去。

问应当让哪几个人去?

#includevoidmain()inta,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(Awill%sbeassigned.n,a?

:

not);printf(Bwill%sbeassigned.n,b?

:

not);printf(Cwill%sbeassigned.n,c?

:

not);printf(Dwill%sbeassigned.n,d?

:

not);printf(Ewill%sbeassigned.n,e?

:

not);printf(Fwill%sbeassigned.n,f?

:

not);26、谁在说谎张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。

现在问:

这三人中到底谁说的是真话,谁说的是假话?

#includevoidmain()inta,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!

=0)printf(Zhangsantolda%s.n,a?

truth:

lie);printf(Lisitolda%s.n,b?

truch:

lie);printf(Wangwutolda%s.n,c?

truch:

lie);27、谁是窃贼公安人员审问四名窃贼嫌疑犯。

已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。

在回答公安人员的问题中:

甲说:

“乙没有偷,是丁偷的。

”乙说:

“我没有偷,是丙偷的。

”丙说:

“甲没有偷,是乙偷的。

”丁说:

“我没有偷。

”请根据这四人的答话判断谁是盗窃者。

#includevoidmain()inti,j,a4;for(i=0;i4;i+)/假定只有第i个人为窃贼for(j=0;j4;j+)/在第i轮假设中,假设第i个人为窃贼,把ai设为1,其余为0if(j=i)aj=1;elseaj=0;if(a3+a1=1&a1+a2=1&a0+a1=1)/判断条件是否成立printf(Thethiefis);/成立for(j=0;j=3;j+)/输出计算结果if(aj)printf(%c.,j+A);printf(n);28、黑与白有A、B、C、D、E五人,每人额头上都贴了一张黑或白的纸。

五人对坐,每人都可以看到其它人额头上的纸的颜色。

五人相互观察后,A说:

“我看见有三人额头上贴的是白纸,一人额头上贴的是黑纸。

”B说:

“我看见其它四人额头上贴的都是黑纸。

”C说:

“我看见一人额头上贴的是白纸,其它三人额头上贴的是黑纸。

”D说:

“我看见四人额头上贴的都是白纸。

”E什么也没说。

现在已知额头上贴黑纸的人说的都是谎话,额头贴白纸的人说的都是实话。

问这五人谁的额头是贴白纸,谁的额头是贴黑纸?

#includevoidmain()inta,b,c,d,e;for(a=0;a=1;a+)/黑色:

0白色:

1for(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