下载

5下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 c+c++语言经典、实用、趣味程序设计编程

c+c++语言经典、实用、趣味程序设计编程.doc

c+c++语言经典、实用、趣味程序设计编程

shangchong66
2009-05-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《c+c++语言经典、实用、趣味程序设计编程doc》,可适用于IT/计算机领域

CC语言经典、实用、趣味程序设计编程百例精解() 绘制余弦曲线在屏幕上用“*”显示~度的余弦函数cos(x)曲线*问题分析与算法设计如果在程序中使用数组这个问题十分简单。但若规定不能使用数组问题就变得不容易了。关键在于余弦曲线在~度的区间内一行中要显示两个点而对一般的显示器来说只能按行输出即:输出第一行信息后只能向下一行输出不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*”。为了同时得到余弦函数cos(x)图形在一行上的两个点考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x列方向定义为y则~度的图形与~度的图形是左右对称的若定义图形的总宽度为列计算出x行~度时y点的坐标m那么在同一行与之对称的~度的y点的坐标就应为m。程序中利用反余弦函数acos计算坐标(x,y)的对应关系。使用这种方法编出的程序短小精炼体现了一定的技巧。*程序说明与注释#include<stdioh>#include<mathh>intmain(){doubleyintx,mfor(y=y>=y=)*y为列方向值从到步长为*{m=acos(y)**计算出y对应的弧度m乘以为图形放大倍数*for(x=x<mx)printf("")printf("*")*控制打印左侧的*号*for(x<mx)printf("")printf("*n")*控制打印同一行中对称的右侧*号*}return}*思考题如何实现用“*”显示~度的sin(x)曲线。在屏幕上显示~度的cos(x)曲线与直线f(x)=*(y)的迭加图形。其中cos(x)图形用“*”表示f(x)用“”表示在两个图形相交的点上则用f(x)图形的符号。绘制余弦曲线和直线*问题分析与算法设计本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后正确判断相互的位置关系。为此可以先判断图形的交点再分别控制打印两个不同的图形。*程序注释与说明#include<stdioh>#include<mathh>intmain(){doubleyintx,m,n,yyfor(yy=yy<=yy)*对于第一个y坐标进行计算并在一行中打印图形*{y=*yy*y:屏幕行方向坐标*m=acos(y)**m:cos(x)曲线上y点对应的屏幕列坐标*n=*(y)*n:直线上y点对应的列坐标*for(x=x<=x)*x:屏幕列方向坐标*if(x==mx==n)printf("")*直线与cos(x)相交时打印“”*elseif(x==n)printf("")*打印不相交时的直线图形*elseif(x==m||x==m)printf("*")*打印不相交时的cos(x)图形*elseprintf("")*其它情况打印空格*printf("n")}return}*思考题如何实现sin(x)曲线与cos(x)曲线图形的同时显示。绘制圆在屏幕上用“*”画一个空心的圆*问题分析与算法设计打印圆可利用图形的左右对称性。根据圆的方程:R*R=X*XY*Y可以算出圆上每一点行和列的对应关系。*程序说明与注释#include<stdioh>#include<mathh>intmain(){doubleyintx,mfor(y=y>=y–){m=*sqrt(y*y)*计算行y对应的列坐标m是屏幕纵横比调节系数因为屏幕的行距大于列距不进行调节显示出来的将是椭圆*for(x=x<mx)printf("")*图形左侧空白控制*printf("*")*圆的左侧*for(x<mx)printf("")*图形的空心部分控制*printf("*n")*圆的右侧*}return}*思考题实现函数y=x的图形与圆的图形叠加显示歌星大奖赛在歌星大奖赛中有个评委为参赛的选手打分分数为~分。选手最后得分为:去掉一个最高分和一个最低分后其余个分数的平均值。请编写一个程序实现。*问题分析与算法设计这个问题的算法十分简单但是要注意在程序中判断最大、最小值的变量是如何赋值的。*程序说明与注释#include<stdioh>intmain(){intinteger,i,max,min,summax=*先假设当前的最大值max为C语言整型数的最小值*min=*先假设当前的最小值min为C语言整型数的最大值*sum=*将求累加和变量的初值置为*for(i=i<=i){printf("Inputnumberd=",i)scanf("d",integer)*输入评委的评分*sum=integer*计算总分*if(integer>max)max=integer*通过比较筛选出其中的最高分*if(integer<min)min=integer*通过比较筛选出其中的最低分*}printf("Canceledmaxscore:dnCanceledminscore:dn",max,min)printf("Averagescore:dn",(summaxmin))*输出结果*}*运行结果Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Inputnumber=Canceledmaxscore:Canceledminscore:Averagescore:*思考题题目条件不变但考虑同时对评委评分进行裁判即在个评委中找出最公平(即评分最接返平均分)和最不公平(即与平均分的差距最大)的评委程序应该怎样实现?求最大数问的约数中最大的三位数是多少?*问题分析与算法设计根据约数的定义对于一个整数N除去和它自身外凡能整除N的数即为N的约数。因此最简单的方法是用到N之间的所有数去除N即可求出N的全部约数。本题只要求取约数中最大的三位数则其取值范围可限制在到之间。*程序说明与注释#include<stdioh>intmain(){longiintjprintf("Pleaseinputnumber:")scanf("ld",i)for(j=j>=j–)if(ij==){printf("Themaxfactorwithdigitsinldis:d,n",i,j)break}}*运行结果输入:输出:Themaxfactorwithdigitsinis:高次方数的尾数求的次方的最后三位数*问题分析与算法设计解本题最直接的方法是:将累乘次方截取最后三位即可。但是由于计算机所能表示的整数范围有限用这种“正确”的算法不可能得到正确的结果。事实上题目仅要求最后三位的值完全没有必要求的次方的完整结果。研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关与乘数和被乘数的高位无关。利用这一规律可以大大简化程序。*程序说明与注释#include<stdioh>intmain(){inti,x,y,last=*变量last保存求X的Y次方过程中的部分乘积的后三位*printf("InputXandY(X**Y):")scanf("d**d",x,y)for(i=i<=yi)*X自乘Y次*last=last*x*将last乘X后对取模即求积的后三位*printf("Thelastdigitsofd**dis:dn",x,y,last)*打印结果*}*运行结果InputXandY(X**Y):**Thelastdigitsof**is:InputXandY(X**Y):**Thelastdigitsof**is:阶乘尾数零的个数!的尾数有多少个零? *问题分析与算法设计  可以设想:先求出!的值然后数一下末尾有多少个零。事实上与上题一样由于计算机所能表示的整数范围有限这是不可能的。  为了解决这个问题必须首先从数学上分析在!结果值的末尾产生零的条件。不难看出:一个整数若含有一个因子则必然会在求!时产生一个零。因此问题转化为求到这个整数中包含了多少个因子。若整数N能被整除则N包含个因子若整数N能被整除则N包含个因子。*程序说明与注释#include<stdioh>intmain(){inta,count=for(a=a<=a=)循环从开始以的倍数为步长考察整数{count若为的倍数计数器加if(!(a))count若为的倍数计数器再加}printf("Thenumberofintheendof!is:dn",count)打印结果return}*运行结果Thenumberofintheendof!is:*问题进一步讨论本题的求解程序是正确的但是存在明显的缺点。程序中判断整数N包含多少个因子的方法是与程序中的有关的若题目中的改为则就要修改程序中求因子的数目的算法了。*思考题修改程序中求因子的数目的算法使程序可以求出任意N!的末尾有多少个零。借书方案知多少小明有五本新书要借给ABC三位小朋友若每人每次只能借一本则可以有多少种不同的借法?*问题分析与算法设计本问题实际上是一个排列问题即求从个中取个进行排列的方法的总数。首先对五本书从至进行编号然后使用穷举的方法。假设三个人分别借这五本书中的一本当三个人所借的书的编号都不相同时就是满足题意的一种借阅方法。*程序说明与注释intmain(){inta,b,c,count=printf("TherearediffrentmethodsforXMtodistributebookstoreaders:n")for(a=a<=a)*穷举第一个人借本书中的本的全部情况*for(b=b<=b)*穷举第二个人借本书中的一本的全部情况*for(c=a!=bc<=c)*当前两个人借不同的书时穷举第三个人借本书中的本的全部情况*if(c!=ac!=b)*判断第三人与前两个人借的书是否不同*printf(count"d:d,d,d":"d:d,d,dn",count,a,b,c)*打印可能的借阅方法*}*运行结果TherearediffrentmethodsforXMtodistributebookstoreaders::,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,:,,杨辉三角形在屏幕上显示杨辉三角形                                          ………………………………*问题分析与算法设计杨辉三角形中的数正是(xy)的N次方幂展开式各项的系数。本题作为程序设计中具有代表性的题目求解的方法很多这里仅给出一种。从杨辉三角形的特点出发可以总结出:)第N行有N个值(设起始行为第行))对于第N行的第J个值:(N>=)当J=或J=N时:其值为J!=且J!=N时:其值为第N行的第J个值与第N行第J个值之和将这些特点提炼成数学公式可表示为:x=或x=Nc(x,y)=c(x,y)c(x,y)其它本程序应是根据以上递归的数学表达式编制的。*程序说明与注释#include<stdioh>intmain(){inti,j,n=printf("N=")while(n>)scanf("d",n)*控制输入正确的值以保证屏幕显示的图形正确*for(i=i<=ni)*控制输出N行*{for(jj<*ij)printf("")*控制输出第i行前面的空格*for(j=j<ij)printf("d",c(i,j))*输出第i行的第j个值*printf("n")}}voidintc(intx,inty)*求杨辉三角形中第x行第y列的值*{intzif((y==)||(y==x))return*若为x行的第或第x列则输出*z=c(x,y)c(x,y)*否则其值为前一行中第y列与第y列值之和*returnz}*思考题自行设计一种实现杨辉三角形的方法数制转换将任一整数转换为二进制形式*问题分析与算法设计将十进制整数转换为二进制的方法很多这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说一个整数在计算机内就是以二进制的形式存储的所以没有必要再将一个整数经过一系列的运算转换为二进制形式只要将整数在内存中的二进制表示输出即可。*程序说明与注释#include<stdioh>voidprintb(int,int)intmain(){intxprintf("Inputnumber:")scanf("d",x)printf("numberofdecimalform:dn",x)printf("it'sbinaryform:")printb(x,sizeof(int)*)*x:整数sizeof(int):int型在内存中所占的字节数sizeof(int)*:int型对应的位数*putchar('n')}voidprintb(intx,intn){if(n>){putchar(''((unsigned)(x(<<(n)))>>(n)))*输出第n位*printb(x,n)*归调用输出x的后n位*}}*运行结果输入:输出:numberofdecimalform:it'sbunaryform:输入:输出:numberofdecimalform:it'sbinaryform:输入:输出:numberofdecimalform:it'sbinaryform:输入:输出:numberofdecimalform:it'sbinaryform:输入:输出:numberofdecimalform:it'sbinaryform:*问题的进一步讨论充分利用C语言可以对位进行操作的特点可以编写许多其它高级语言不便于编写甚至根本无法编写的程序。位操作是C语言的一大特点在深入学习C语言的过程中应力求很好掌握。程序中使用的位运算方法不是最佳的也可以不用递归操作大家可以自行对程序进行优化。*思考题将任意正整数转换为四进制或八进制数CC语言经典、实用、趣味程序设计编程百例精解() 打鱼还是晒网 中国有句俗语叫“三天打鱼两天晒网”。某人从年月日起开始“三天打鱼两天晒网”问这个人在以后的某一天中是“打鱼”还是“晒网”。*问题分析与算法设计根据题意可以将解题过程分为三步:)计算从年月日开始至指定日期共有多少天)由于“打鱼”和“晒网”的周期为天所以将计算出的天数用去除)根据余数判断他是在“打鱼”还是在“晒网”若余数为则他是在“打鱼”否则是在“晒网”在这三步中关键是第一步。求从年月日至指定日期有多少天要判断经历年份中是否有闰年二月为天平年为天。闰年的方法可以用伪语句描述如下:如果((年能被除尽且不能被除尽)或能被除尽)则该年是闰年否则不是闰年。C语言中判断能否整除可以使用求余运算(即求模)*程序说明与注释#include<stdioh>intdays(structdateday)structdate{intyearintmonthintday}intmain(){structdatetoday,termintyearday,year,dayprintf("Enteryearmonthday:")scanf("ddd",todayyear,todaymonth,todayday)*输入日期*termmonth=*设置变量的初始值:月*termday=*设置变量的初始值:日*for(yearday=,year=year<todayyearyear){termyear=yearyearday=days(term)*计算从年至指定年的前一年共有多少天*}yearday=days(today)*加上指定年中到指定日期的天数*day=yearday*求余数*if(day>day<)printf("hewasfishingatthatdayn")*打印结果*elseprintf("Hewassleepingatthatdayn")}intdays(structdateday){staticintdaytab={{,,,,,,,,,,,,,},*平均每月的天数*{,,,,,,,,,,,,,},}inti,lplp=dayyear==dayyear!=||dayyear==*判定year为闰年还是平年lp=为平年非为闰年*for(i=i<daymonthi)*计算本年中自月日起的天数*dayday=daytablpireturndayday}*运行结果Enteryearmonthday:HewasfishingatdayEnteryearmonthday:HewassleepingatdayEnteryearmonthday:Hewassleepingatday*思考题请打印出任意年份的日历抓交通肇事犯一辆卡车违反交通规则撞人后逃跑。现场有三人目击事件但都没有记住车号只记下车号的一些特征。甲说:牌照的前两位数字是相同的乙说:牌照的后两位数字是相同的但与前两位不同丙是数学家他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。*问题分析与算法设计按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数然后判断该整数是否是另一个整数的平方。*程序说明与注释#include<stdioh>#include<mathh>intmain(){inti,j,k,cfor(i=i<=i)*i:车号前二位的取值*for(j=j<=j)*j:车号后二位的取值*if(i!=j)*判断二位数字是否相异*{k=i*i*j*j*计算出可能的整数*for(c=c*c<kc)*判断该数是否为另一整数的平方*if(c*c==k)printf("Lorry–Noisdn",k)*若是打印结果*}}*运行结果LorryNois 该存多少钱假设银行一年整存零取的月息为。现在某人手中有一笔钱他打算在今后的五年中的年底取出元到第五年时刚好取完请算出他存钱时应存入多少。*问题分析与算法设计分析存钱和取钱的过程可以采用倒推的方法。若第五年年底连本带息要取元则要先求出第五年年初银行存款的钱数:第五年初存款=(*)依次类推可以求出第四年、第三年……的年初银行存款的钱数:第四年年初存款=(第五年年初存款)(*)第三年年初存款=(第四年年初存款)(*)第二年年初存款=(第三年年初存款)(*)第一年年初存款=(第二年年初存款)(*)通过以上过程就可以很容易地求出第一年年初要存入多少钱。*程序说明与注释#include<stdioh>intmain(){intifloattotal=for(i=i<i)*i为年数取值为~年*total=(total)(*)*累计算出年初存款数额第五次的计算结果即为题解*printf("Hemustsavefatfirstn",total)}*运行结果Hemustsaveatfirst怎样存钱利最大假设银行整存整取存款不同期限的月息利率分别为:期限=年期限=年期限=年期限=年期限=年利息=本金*月息利率**存款年限。现在某人手中有元钱请通过计算选择一种存钱方案使得钱存入银行年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。*问题分析与算法设计为了得到最多的利息存入银行的钱应在到期时马上取出来然后立刻将原来的本金和利息加起来再作为新的本金存入银行这样不断地滚动直到满年为止由于存款的利率不同所以不同的存款方法(年限)存年得到的利息是不一样的。分析题意设元存年其中年存i次年存i次年存i次年存i次年存i次则到期时存款人应得到的本利合计为:*(rate)i*(rate)i*(rate)i*(rate)i*(rate)i其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件:<=i<=<=i<=(*i)<=i<=(*i*i)<=i<=(*i*i*i)<=i=*i*i*i*i可以用穷举法穷举所有的i、i、i、i和i的组合代入求本利的公式计算出最大值就是最佳存款方案。*程序说明与注释#include<stdioh>#include<mathh>intmain(){inti,i,i,i,i,n,n,n,n,nfloatmax=,termfor(i=i<i)*穷举所有可能的存款方式*for(i=i<=(*i)i)for(i=i<=(*i*i)i)for(i=i<=(*i*i*i)i){i=*i*i*i*iterm=*pow((double)(*),(double)i)*pow((double)(**),(double)i)*pow((double)(**),(double)i)*pow((double)(**),(double)i)*pow((double)(**),(double)i)*计算到期时的本利合计*if(term>max){max=termn=in=in=in=in=i}}printf("Formaxinumprofit,heshouldsosavehismoneyinabank:n")printf("madefixeddepositforyear:dtimesn",n)printf("madefixeddepositforyear:dtimesn",n)printf("madefixeddepositforyear:dtimesn",n)printf("madefixeddepositforyear:dtimesn",n)printf("madefixeddepositforyear:dtimesn",n)printf("Toal:fn",max)*输出存款方式*}*运行结果Formaxinumprofit,heshouldsosavehismoneyinabank:madefixeddepositforyear:timesmadefixeddepositforyear:timesmadefixeddepositforyear:timesmadefixeddepositforyear:timesmadefixeddepositforyear:timesTotal:可见最佳的存款方案为连续四次存年期。*思考题某单位对职工出售住房每套为万元。买房付款的方法是:一次交清优惠从第一年开始每年年初分期付款:年交清优惠年交清优惠年交清没有优惠。现在有人手中正好有万元若假定在今后年中物价和银行利率均保持不变问他应当选择哪种付款方式可以使应付的钱最少?捕鱼和分鱼A、B、C、D、E五个人在某天夜里合伙去捕鱼到第二天凌晨时都疲惫不堪于是各自找地方睡觉。日上三杆A第一个醒来他将鱼分为五份把多余的一条鱼扔掉拿走自己的一份。B第二个醒来也将鱼分为五份把多余的一条鱼扔掉保持走自己的一份。C、D、E依次醒来也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?*问题分析与算法设计根据题意总计将所有的鱼进行了五次平均分配每次分配时的策略是相同的即扔掉一条鱼后剩下的鱼正好分成五份然后拿走自己的一份余下其它的四份。假定鱼的总数为X则X可以按照题目的要求进行五次分配:X后可被整除余下的鱼为*(X)、。若X满足上述要求则X就是题目的解。*程序说明与注释#include<stdioh>intmain(){intn,i,x,flag=*flag:控制标记*for(n=flagn)*采用试探的方法。令试探值n逐步加大*{for(x=n,i=flagi<=i)if((x)==)x=*(x)elseflag=*若不能分配则置标记falg=退出分配过程*if(flag)break*若分配过程正常结束则找到结果退出试探的过程*elseflag=*否则继续试探下一个数*}printf("Totalnumberoffishcatched=dn",n)*输出结果*}*运行结果Totalnumberoffishcatched=*问题的进一步讨论程序采用试探法试探的初值为每次试探的步长为。这是过分保守的做法。可以在进一步分析题目的基础上修改此值增大试探的步长值以减少试探次数。*思考题请使用其它的方法求解本题。出售金鱼 买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条第二次卖出余下的三分之一加三分之一条第三次卖出余下的四分之一加四分之一条第四次卖出余下的五分之一加五分之一条最后卖出余下的条。问原来的鱼缸中共有几条金鱼?*问题分析与算法设计题目中所有的鱼是分五次出售的每次卖出的策略相同第j次卖剩下的(j)分之一再加(j)条。第五次将第四次余下的条全卖了。假定第j次鱼的总数为X则第j次留下:x(x)(j)当第四次出售完毕时应该剩下条。若X满足上述要求则X就是题目的解。应当注意的是:"(x)(j)"应满足整除条件。试探X的初值可以从开始试探的步长为因为X的值一定为奇数。*程序说明与注释#include<stdioh>intmain(){inti,j,n=,x*n为标志变量*for(i=n==i=)*控制试探的步长和过程*{for(j=,x=ij<=x>=j)*完成出售四次的操作*if((x)(j)==)*若满足整除条件则进行实际的出售操作*x=(x)(j)else{x=break}*否则停止计算过程*if(j==x==)*若第四次余下条则满足题意*{printf("Therearedfishesatfirstn",i)*输出结果*n=*控制退出试探过程*}}}*运行结果Therearefishesatfirst*思考题日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的给老二老二拿到后连同原先的桔子分给老三老三拿到后连同原先的桔子分给老四老四拿到后连同原先的桔子分给老五老五拿到后连同原先的桔子分给老六老六拿到后连同原先的桔子分给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?平分七筐鱼甲、乙、丙三位鱼夫出海打鱼他们随船带了只箩筐。当晚返航时他们发现有七筐装满了鱼还有七筐装了半筐鱼另外七筐则是空的由于他们没有秤只好通过目测认为七个满筐鱼的重量是相等的个半筐鱼的重量是相等的。在不将鱼倒出来的前提下怎样将鱼和筐平分为三份?*问题分析与算法设计根据题意可以知道:每个人应分得七个箩筐其中有筐鱼。采用一个*的数组a来表示三个人分到的东西。其中每个人对应数组a的一行数组的第列放分到的鱼的整筐数数组的第列放分到的半筐数数组的第列放分到的空筐数。由题目可以推出:。数组的每行或每列的元素之和都为。对数组的行来说满筐数加半筐数=。每个人所得的满筐数不能超过筐。每个人都必须至少有个半筐且半筐数一定为奇数对于找到的某种分鱼方案三个人谁拿哪一份都是相同的为了避免出现重复的分配方案可以规定:第二个人的满筐数等于第一个人的满筐数第二个人的半筐数大于等于第一个人的半筐数。*程序说明与注释#include<stdioh>inta,countintmain(){inti,j,k,m,n,flagprintf("Itexistspossibledistribtionplans:n")for(i=i<=i)*试探第一个人满筐a的值满筐数不能>*{a=ifor(j=ij<=ij<=j)*试探第二个人满筐a的值满筐数不能>*{a=jif((a=ja)>)continue*第三个人满筐数不能>*if(a<a)break*要求后一个人分的满筐数>=前一个人以排除重复情况*for(k=k<=k=)*试探半筐a的值半筐数为奇数*{a=kfor(m=m<km=)*试探半筐a的值半筐数为奇数*{a=ma=kmfor(flag=,n=flagn<n)*判断每个人分到的鱼是筐flag为满足题意的标记变量*if(anan<an*an==)an=anan*计算应得到的空筐数量*elseflag=*不符合题意则置标记为*if(flag){printf("NodFullbasketSemi–basketEmptyn",count)for(n=n<n)printf("fisherc:dddn",'A'n,an,an,an)}}}}}}*运行结果Itexistspossibledistributionplans:NoFullbasketSemi–basketEmptyfisherA:fisherB:fisherC:NoFullbasketSemi–basketEmptyfisherA:fisherB:fisherC:*思考题晏会上数学家出了一道难题:假定桌子上有三瓶啤酒癣瓶子中的酒分给几个人喝但喝各瓶酒的人数是不一样的。不过其中有一个人喝了每一瓶中的酒且加起来刚好是一瓶请问喝这三瓶酒的各有多少人?(答案:喝三瓶酒的人数分别是人、人和人) 有限位数个位数为且能被整除的五位数共有多少?*题目分析与算法设计根据题意可知满足条件的五位数的选择范围是、。。。。可设基础数i=通过计算i*即可得到欲选的数(i的变化范围是~)再判断该数能否被整除。*程序说明与注释#include<stdioh>intmain(){longintiintcount=*count:统计满足条件的五位数的个数*for(i=i<i)if(!((i*)))*判断所选的数能否被整除*count*若满足条件则计数*printf("count=dn",count)}*运行结果count= *思考题求到之间有多少个其数字之和为的整数。(答案:)除不尽的自然数一个自然数被除余所得的商被除也余再将第二次的商被除后余最后得到一个商为a。又知这个自然数被除余所得的商被除余最后得到一个商是a的倍。求这个自然数。*问题分析与算法设计根据题意可设最后的商为i(i从开始取值)用逆推法可以列出关系式:(((i*)*))*=((*i*))*再用试探法求出商i的值。*程序说明与注释#include<stdioh>intmain(){intifor(i=i)*试探商的值*if(((i*)*)*==(*i)*){*逆推判断所取得的当前i值是否满足关系式**若满足则输出结果*printf("Therequirednumberis:dn",(*i)*)break*退出循环*}}*运行结果Therequirednumberis:一个奇异的三位数 一个自然数的七进制表达式是一个三位数而这个自然数的九进制表示也是一个三位数且这两个三位数的数码正好相反求这个三位数。*问题分析与算法设计根据题意可知七进制和九进制表示的这全自然数的每一位一定小于可设其七进制数形式为kji(i、j、k的取值分别为~)然后设其九进制表示形式为ijk。*程序说明与注释#include<stdioh>intmain(){inti,j,kfor(i=i<i)for(j=j<j)for(k=k<k)if(i**j*k==ij*k**){printf("Thespecialnumberwithdigitsis:")printf("ddd()=ddd()=d()n",k,j,i,i,j,k,i**j*k)}}*运行结果Thespecialnumberwithdigitsis:()=()=()CC语言经典、实用、趣味程序设计编程百例精解() 位反序数 设N是一个四位数它的倍恰好是其反序数求N。反序数就是将整数的数字倒过来形成的整数。例如:的反序数是。*问题分析与算法设计可设整数N的千、百、十、个位为i、j、k、l其取值均为~则满足关系式:(i*j**kl)*=(l*k**ji)的i、j、k、l即构成N。*程序说明与注释#include<stdioh>intmain(){intifor(i=i<i)*穷举四位数可能的值*if(i*i*i*i==i*)*判断反序数是否是原整数的倍*printf("Thenumbersatisfiedstatsconditionis:dn",i)*若是则输出*}*运行结果Thenumbersatisfiedstatesconditionis:求车速一辆以固定速度行驶的汽车司机在上午点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的)为。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?*问题分析与算法设计根据题意设所求对称数为i其初值为对其依次递增取值将i值的每一位分解后与其对称位置上的数进行比较若每个对称位置上的数皆相等则可判定i即为所求的对称数。*程序说明与注释#include<stdioh>intmain(){intt,a*数组a存放分解的数字位*longintk,ifor(i=i)*以为初值循环试探*{for(t=,k=k>=t)*从高到低分解所取i值的每位数*{*字依次存放于a~a中*at=(ik)(k)k=}if((a==a)(a==a)){printf("Thenewsymmetricalnumberkelometersis:dddddn",a,a,a,a,a)printf("Thevelocityofthecaris:fn",(i))break}}}*运行结果Thenewsymmetricalnumberkelometersis:Thevelocityofthecaris:*思考题将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数则称它为对称数。求不超过的最大的二进制的对称数。 由两个平方三位数获得三个平方二位数 已知两个平方三位数abc和xyz其中a、b、c、x、y、z未必是不同的而ax、by、cz是三个平方二位数。请编程求三位数abc和xyz。*问题分析与算法设计任取两个平方三位数n和n将n从高向低分解为a、b、c将n从高到低分解为x、y、z。判断ax、by、cz是否均为完全平方数。*程序说明与注释#include<stdioh>#include<mathh>voidf(intn,float*s)intmain(){inti,tfloata,bprint("Thepossibleperfectsquarescombinationsare:n")for(i=i<=i)穷举平方三位数的取值范围for(t=t<=t){f(i*i,a)分解平方三位数的各位每位数字分别存入数组中f(t*t,b)if(sqrt(a*b)==(int)sqrt(a*b)sqrt(a*b)==(int)sqrt(a*b)sqrt(a*b)==(int)sqrt(a*b)){printf("danddn,i*i,t*t")若三个新的数均是完全平方数则输出}}} *分解三位数n的各位数字将各个数字从高到低依次存入指针s所指向的数组中*voidf(intn,float*s){intkfor(k=k>=s){*s=(nk)(k)k=}}*运行结果Thepossibleperfectsquarescombinationsare:andand*思考题求这样一个三位数该三位数等于其每位数字的阶乘之和。即abc=a!b!c!(正确结果:=!!!) 阿姆斯特朗数 如果一个正整数等于其各个数字的立方和则称该数为阿姆斯特朗数(亦称为自恋性数)。如=就是一个阿姆斯特朗数。试编程求以内的所有阿姆斯特朗数。*问题分析与算法设计可采用穷举法依次取以内的各数(设为i)将i的各位数字分解后据阿姆斯特朗数的性质进行计算和判断。*程序说明与注释#include<stdioh>intmain(){inti,t,k,aprintf("TherearefollwingArmstrongnumbersmallerthan:n")for(i=i<i)*穷举要判

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/121

c+c++语言经典、实用、趣味程序设计编程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利