C语言100道经典、实用、趣味程序设计编程百例精解

上传人:微*** 文档编号:168529961 上传时间:2022-11-10 格式:DOCX 页数:140 大小:228.17KB
返回 下载 相关 举报
C语言100道经典、实用、趣味程序设计编程百例精解_第1页
第1页 / 共140页
C语言100道经典、实用、趣味程序设计编程百例精解_第2页
第2页 / 共140页
C语言100道经典、实用、趣味程序设计编程百例精解_第3页
第3页 / 共140页
点击查看更多>>
资源描述
摘要在屏幕上用“*”显示0360度的余弦函数cos(x)曲线。关键在于余弦曲线在0360 度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第 一行信息后,只能向下一行输出,不能再返回到上一行。在屏幕上用“显示。360度的余弦函数cos(x)曲线问题分析与算法设计如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。 关键在于余弦曲线在O、360度的区间内,一行中要显示两个点,而对一般的显示器来说,只 能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得 本文要求的图形就必须在一行中一次输出两个“。为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将 屏幕的行方向定义为x,列方向定义为y,则、180度的图形与180、360度的图形是左右对 称的,若定义图形的总宽度为62歹,计算出x行0180度时y点的坐标m,那么在同一行 与之对称的180360度的y点的坐标就应为62-m程序中利用反余弦函数acos计算坐标 (x, y)的对应关系。使用这种方法编出的程序短小精炼,体现了一定的技巧。程序说明与注释#include#includeint main()(double y;int x, m;for(y=l;y=-l;y-=0. 1) /*y为列方向,值从1到T,步长为0.1*/(m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数/for(x=l;xm;x+) printf(* );printf*);/控制打印左侧的号/for(;x62-m;x+)printf();printf (*n); /控制打印同一行中对称的右侧号/2.绘制余弦曲线和直线摘要在屏幕上显示0360度的cos(x)曲线与直线f(x)=45*(y-l)+31的迭加图形。其中cos(x) 图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。图形 迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置 关系。在屏幕上显示、360度的cos(x)曲线与直线f (x) =45*(y-1)+31的迭加图形。其中cos (x) 图形用“*”表示,f(x)用“ + ”表示,在两个图形相交的点上则用f(x)图形的符号。问题分析与算法设计本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的 列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打 印两个不同的图形。程序注释与说明#include#includeint main ()double y;int x, m, n, yy;for (yy=0; yy=20; yy+) /对于第一个y坐标进行计算并在一行中打印图形/y=0. l*yy; /*y:屏幕行方向坐标/m=acos(l-y)*10; /*m: cos(x)曲线上y点对应的屏幕列坐标/n=45*(y-1)+31; /*n:直线上y点对应的列坐标/for(x=0;x=62;x+) /*x:屏幕列方向坐标/if (x=m&x=n) printf (+); /直线与 cos (x)相交时打印*/else if(x=n) printf(+”);/打印不相交时的直线图形*/else if(x=m| |x=62-m) printf(*); /打印不相交时的 cos(x)图形/else printf (;/其它情况打印空格*/ printf(n);摘要在屏幕上用“*”画一个空心的圆问题分析与算法设计:打印圆可利用图形的左右对 称性。根据圆的方程:R*R=X*X+Y*Y可以算出圆上每一点行和列的对应关系。思考题:实 现函数y=x2的图形与圆的图形叠加显示在屏幕上用“画一个空心的圆问题分析与算法设计打印圆可利用图形的左右对称性。根据圆的方程:R*R=X*X+Y*Y可以算出圆上每一点行和列的对应关系。程序说明与注释#include#includeint main () double y;int x, m;for(y=10;y=-10;y-)(m=2. 5*sqrt(100-y*y); /*计算行y对应的列坐标m, 2. 5是屏幕纵横比调节系数因为屏幕的 行距大于列距,不进行调节显示出来的将是椭圆/for (x=l; x30-m; x+) printf ( ;/ 图形左侧空白控制/printf*);/*圆的左侧/for(;x30+m;x+) printf(;/图形的空心部分控制/printf (林n;/圆的右侧/return 0;4.歌星大奖赛在歌星大奖赛中,有10个评委为参赛的选手打分,分数为广100分。选手最后得分为: 去掉个最高分和一个最低分后其余8个分数的平均值。请编写个程序实现。题目条件 不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平和最不公平在歌星大奖赛中,有10个评委为参赛的选手打分,分数为广100分。选手最后得分为:去 掉个最高分和一个最低分后其余8个分数的平均值。请编写个程序实现。问题分析与算法设计这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。程序说明与注释#includeint main ()(int integer, i, max, min, sum;max二一32768; /先假设当前的最大值max为C语言整型数的最小值/min=32767 ;/先假设当前的最小值min为C语言整型数的最大值/sum=0; /运行结果Input numberl=90Input number2=91Input number3=93Input number4=94Input number5=90Input number6=99Input number7=97Input number8=92Input number9=91Input number10=95Canceled max score:99Canceled min score:90Average score:92将求累加和变量的初值置为0/for(i=l;imax)max=integer; /通过比较筛选出其中的最高分/if(integermin)min=integer; /通过比较筛选出其中的最低分/printf (Canceled max score:%dnCance 1 ed min score:%dnz/, max, min);printf (Average score:%dn, (sum-max-min)/8) ; /输出结果/ 5,求最大数摘要问555555的约数中最大的三位数是多少?根据约数的定义,对于个整数N,除去1 和它自身外,凡能整除N的数即为N的约数。因此,最简单的方法是用2到N-1之间的所 有数去除N,即可求出N的全部约数。本题只要求取约数中最大的三位数,则其取值范围可 限制在!00到999之间。问555555的约数中最大的三位数是多少?问题分析与算法设计根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。因 此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。本题只要求 取约数中最大的三位数,则其取值范围可限制在!00到999之间。程序说明与注释#include int main ()long i;int j;printf (Please input number:z/);scanf (%ld, &i);for(j=999;j=100;j-)if(i%j=O)printfl The max factor with 3 digits in %ld is:%d, n*,i, j);break;运行结果输入:555555输出:The max factor with 3 digits in 555555 is:7776.高次方数的尾数摘要求13的13次方的最后三位数?解本题最直接的方法是:将13累乘13次方截取最后 三位即可。但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到 正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结 果。求13的13次方的最后三位数问题分析与算法设计解本题最直接的方法是:将13累乘13次方截取最后三位即可。但是山于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。 事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘 数的高位无关。利用这一规律,可以大大简化程序。程序说明与注释#includeint main()int i, x, y, last=1; /变量last保存求X的Y次方过程中的部分乘积的后三位/printf(Input X and Y(XThe last 3 digits of 13*20 is:801Y):);scanf(%d*%d, &x, &y);for(i=l;i=y;i+) /运行结果Input X and Y(X*Y):13*13The last 3 digits of 13*13 is:253Input X and Y(X*Y):13*20X 自乘 Y 次/last=last*x%1000; /将last乘X后对1000取模,即求积的后三位/printf (The last 3 digits of %d*%d is:%dn, x, y, last%1000); /打印结果/ 7.阶乘尾数零的个数摘要100!的尾数有多少个零?为了解决这个问题,必须首先从数学上分析在100!结果值的 末尾产生零的条件。不难看出:个整数若含有一个因子5,则必然会在求100!时产生一 个零。因此问题转化为求1到100这!00个整数中包含了多少个因子5100!的尾数有多少个零? 问题分析与算法设计可以设想:先求出100!的值,然后数一下末尾有多少个零。事实上,与上题样,由 于计算机所能表示的整数范围有限,这是不可能的。为了解决这个问题,必须首先从数学上分析在100!结果值的末尾产生零的条件。不难 看出:个整数若含有一个因子5,则必然会在求100!时产生一个零。因此问题转化为求1 到100这100个整数中包含了多少个因子5。若整数N能被25整除,则N包含2个因子5; 若整数N能被5整除,则N包含1个因子5。 程序说明与注释#includeint main()int a,count ;for(a=5;a=100;a+=5) 循环从5开始,以5的倍数为步长,考察整数(+count; /若为5的倍数,计数器加1if (! (a%25) +count; 若为25的倍数,计数器再加1)printf (The number of 0 in the end of 100! is: %d. n, count)! 打印结果 return 0;) 运行结果The number of 0 in the end of 100! is: 24. 问题进步讨论 本题的求解程序是正确的,但是存在明显的缺点。程序中判断整数N包含多少个因子5的方 法是与程序中的100有关的,若题目中的100改为1000,则就要修改程序中求因子5的数 目的算法了。8.借书方案知多少摘要小明有五本新书,要借给A, B, C三位小朋友,若每人每次只能借一本,则可以有多 少种不同的借法?本问题实际上是个排列问题,即求从5个中取3个进行排列的方法的 总数。首先对五本书从1至5进行编号,然后使用穷举的方法。小明有五本新书,要借给A, B, C三位小朋友,若每人每次只能借一本,则可以有多少种不 同的借法?问题分析与算法设计本问题实际上是个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书 从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人 所借的书的编号都不相同时,就是满足题意的种借阅方法。程序说明与注释int main ()int a, b, c, count=0;printf (There are diffrent methods for XM to distribute books to 3 readers:nz/); for(a=l;a=5;a+) /穷举第一个人借5本书中的1本的全部情况/ for(b=l;b=5;b+) /穷举第二个人借5本书中的一本的全部情况/for (c=1;a! =b&c=2)当J=1或N+1时:其值为1J!=l且J!=N+1时:其值为第N-1行的第J-1个值与第N-1行第J个值之和将这些特点提炼成数学公式可表示为:1 x=l 或 x=N+lc(x, y)=c(xT, yT)+c(xT, y)其它本程序应是根据以上递归的数学表达式编制的。程序说明与注释#includeint main()int i,j,n=13;printf(N=”);while(n12)scanf(%d,&n) ; /*控制输入正确的值以保证屏幕显示的图形正确/for (i=0; i=n; i+) /*控制输出 N 行/|for(j-0;j24-2*i;j+) printfC;/控制输出第i行前面的空格/for(j=l; ji+2; j+) printf (%4d”, c(i, j); /输出第 i 行的第 j 个值/ void int c(int x, int y) /求杨辉三角形中第x行第y列的值/(int z;if (y=l) I I (y=x+l) return 1; /若为 x 行的第 1 或第 x+1 列,则输出 1运行结果 count=2999/ z=c(xT, yT)+c(xT, y); /否则,其值为前一行中第y-1列与第y列值之和/ return z;)18.有限5位数摘要个位数为6且能被3整除的五位数共有多少?根据题意可知,满足条件的五位数的选 择范围是!0006. 10016. 99996。可设基础数i=1000,通过计算i*10+6即可得到欲选 的数(i的变化范围是100999),再判断该数能否被3整除。个位数为6且能被3整除的五位数共有多少?题目分析与算法设计根据题意可知,满足条件的五位数的选择范围是10006、10016。99996。可设基础数i = 1000, 通过计算i*10+6即可得到欲选的数(i的变化范围是1000999),再判断该数能否被3整除。程序说明与注释#includeint main ()(long int i;int count=0; /*count:统计满足条件的五位数的个数/for(i=1000;i9999;i+)if(!(i*10+6)%3) /判断所选的数能否被3整除/count+; /*若满足条件则计数/printfl count=dn , count);10.数制转换摘要将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了 C语言能够对位 进行操作的特点。对于C语言来说,个整数在计算机内就是以二进制的形式存储的,所 以没有必要再将一个整数经过系列的运算转换为二进制形式,只要将整数在内存中的二 进制表示输出即可。将任一整数转换为二进制形式问题分析与算法设计将卜进制整数转换为二进制的方法很多,这里介绍的实现方法利用了 c语言能够对位进行操 作的特点。对于C语言来说,个整数在计算机内就是以二进制的形式存储的,所以没有必 要再将一个整数经过系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输 出即可。程序说明与注释#includevoid printb(int, int);int main()int x;printf(Input number:);scanf(%d, &x);printf(number of decimal form:%dn, x);printfl it s binary form:);printb(x, sizeof (int)运行结果输入:8输出:number of decimal form:8its bunary form:0000000000001000输入:-88); /*x:整数 sizeof (int): int 型在内存中所占的字节数sizeof (int)*8: int 型对应的位数/ putchar ( n );)void printb(int x,int n)(if(n0)(putchar (* 0* +(unsigned) (x&(l(n-l)(n-l); /输出第 n 位/printb(x, n-l); /归调用,输出x的后nT位/输出:number of decimal form:-8 its binary form:1111111111111000 输入:32767输出:number of decimal form:32767 its binary form:0111111111111111 输入:-32768输出:number of decimal form:-32768 its binary form:1000000000000000 输入:128输出:number of decimal form:128 its binary form:000000001000000011.打鱼还是晒网摘要中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两 天晒网”,问这个人在以后的某天中是“打鱼”还是“晒网”。根据题意可以将解题过 程分为三步:1)计算从1990年1月1日开始至指定日期共有多少天中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒 网”,问这个人在以后的某天中是“打鱼”还是“晒网”。问题分析与算法设计根据题意可以将解题过程分为三步:1)计算从1990年1月1日开始至指定日期共有多少天;2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;3)根据余数判断他是在“打鱼”还是在“晒网”;若余数为1, 2, 3,则他是在“打鱼”否则是在“晒网”在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份 中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下: 如果(年能被4除尽且不能被100除尽)或能被400除尽)则该年是闰年;否则不是闰年。C语言中判断能否整除可以使用求余运算(即求模)程序说明与注释#includeint days(struct date day);struct dateint year;int month;int day;);int main ()struct date today, term;int yearday, year, day;printft Enter year/month/day:z,);scanf (线d%d%d”, fetoday. year, &today. month, &today. day); /*输入日期*/term. month=12; /设置变量的初始值:月/term.day=31; /*设置变量的初始值:日/for(yearday=0, year=1990;year0&day4) printf (运行结果Enter year/month/day:1991 10 25He was fishing at day.Enter year/month/day:1992 10 25He was sleeping at day.Enter year/month/day:1993 10 25He was sleeping at day.he was fishing at that day. n); /打印结果/ else printf(*He was sleeping 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, Ip;lp=day. year%4=0&day. year%100!=0|day. year%400=0;/判定year为闰年还是平年,lp=0为平年,非为闰年/for (i=l; iday. month; i+) /计算本年中自1月1日起的天数/day. day+=day_tabIpi;return day. day;12.抓交通肇事犯摘要辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只 记下车号的些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相 同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是个整数的平方。请根据 以上线索求出车号。辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车 号的些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但 与前两位不同;丙是数学家,他说:四位的车号刚好是个整数的平方。请根据以上线索 求出车号。 问题分析与算法设计按照题的要求造出个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该 整数是否是另个整数的平方。 程序说明与注释#include includemath. hint main()(int i, j, k, c;for(i=l;i=9; i+) /运行结果Lorry _No. is 7744i:车号前二位的取值/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. nzz, k) ; /若是,打印结果/13.该存多少钱摘要假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,打算在今后的五年中 的年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少。分析存钱和取钱 的过程,可采用倒推的方法。若第五年年底连本带息要取1000元,则要先求出第五年年初 银行存款的钱数假设银行一年整存零取的月息为0.63机现在某人手中有一笔钱,他打算在今后的五年中的 年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少。问题分析与算法设计分析存钱和取钱的过程,可以采用倒推的方法。若第五年年底连本带息要取1000元,则要 先求出第五年年初银行存款的钱数: 第五年初存款=1000/(1+12运行结果He must save 4039.44 at first0. 0063)依次类推可以求出第四年、第三年的年初银行存款的钱数:第四年年初存款=(第五年年初存款+1000)/(1+12*0. 0063) 第三年年初存款=(第四年年初存款+1000)/(1+12*0. 0063) 第二年年初存款=(第三年年初存款+1000)/ (1+12*0. 0063) 第一年年初存款=(第二年年初存款+1000)/ (1+12*0. 0063) 通过以上过程就可以很容易地求出第一年年初要存入多少钱。程序说明与注释#include int main() ( int i;float total;for(i=0;i5;i+) /*i 为年数,取值为 4 年/ total=(total+1000)/(l+0.0063*12); /累计算出年初存款数额,第五次的计算 结果即为题解/printf(He must save %. 2f at first. n, total);14.怎样存钱利最大摘要某人手中有2000元钱,通过计算选择种存钱方案,使得钱存入银行20年后得到的 利息最多(假定银行对超过存款期限的那一部分时间不付利息)。为了得到最多的利息,存 入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息加起来再作为新的本金 存入银行假设银行整存整取存款不同期限的月息利率分别为:0. 63%期限=1年0.66%期限=2年0.69%期限=3年0. 75%期限=5年0.84%期限=8年利息=本金月息利率12存款年限。现在某人手中有2000元钱,请通过计算选择种存钱方案,使得钱存入银行20年后得到的 利息最多(假定银行对超过存款期限的那一部分时间不付利息)。问题分析与算法设计为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息 加起来再作为新的本金存入银行,这样不断地滚动直到满20年为止,由于存款的利率不同, 所以不同的存款方法(年限)存20年得到的利息是不一样的。分析题意,设2000元存20年,其中1年存il次,2年存i2次,3年存i3次,5年存i5 次,8年存i8次,则到期时存款人应得到的本利合计为:2000*(1+ratel)i1*(l+rate2)i2*(l+rate3)i3*(l+rate5)i5*(l+rate8)i8其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件:0=i8=20=i5=(20-8*i8)/50=i3=(20-8*i8-5*i5)/30=i2=(20-8*i8-5*i 5-3* i 3)/20=il=20-8*i8-5*i5-3*i3-2*i2可以用穷举法穷举所有的i8、i5、i3、i2和il的组合,代入求本利的公式计算出最大值, 就是最佳存款方案。程序说明与注释#include#includeint main()(int i8, i5, i3, i2, i 1, n8, n5, n3, n2, nl;float max=0, term;for(i8=0; i83; i8+) /*穷举所有可能的存款方式/for(i 5=0;i 5=(20-8*i 8)/5;i 5+)for(i 3=0;i 3=(20-8*i8-5*i 5)/3;i 3+) for(i2=0;i2max) max=term;nl=i1;n2=i2;n3=i3;n5=i5;n8=i8;a bank:n);printfC made printf l made printf(/z made printt made printf made printf( Toalfixed deposit fixed deposit fixed deposit fixed deposit fixed deposit%. 2fn”, max)for 8 year: %d for 5 year: %d for 3 year: %d for 2 year: %d for 1 year: %dtimesn”, n8);timesn , n5);timesn , n3);timesn , n2); timesn”, nl);/输出存款方式/运行结果For maxinum profit, he should sosave his money in a bank:made fixed deposit made fixed deposit made fixed deposit made fixed deposit made fixed deposit Total:8841. 01for 8 year: Otimes for 5 year: 4times for 3 year: Otimes for 2 year: Otimes for 1 year: Otimesprintf( For maxinum profit, he should so save his money in可见最佳的存款方案为连续四次存5年期。15.捕鱼和分鱼摘要A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自 找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己 的份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的份。A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地 方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的 份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E 依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?问题分析与算法设计根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条 鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。假定鱼的总数为X,则X可以按照题目的要求进行五次分配:XT后可被5整除,余下的鱼 为4运行结果Total number of fish catched = 3121(X-1)、5若X满足上述要求,则X就是题目的解。程序说明与注释#include int main() (int n, i, x, flag=l; /*flag!控制标记/for (n=6; flag;n+) /采用试探的方法。令试探值n逐步加大/ |for(x=n, i=l&flag;i=5;i+) if(x-l)%5=0) x=4*(x-l)/5: else flag=0; /若不能分配则置标记falg=0退出分配过程*/ if(flag) break; /若分配过程正常结束则找到结果退出试探的过程/ else flag=l; /否则继续试探下一个数*/ )printf (Total number of fish catched=%dn, n); /输出结果/16.出售金鱼摘要买卖提将养的缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次 卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖 出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼?买卖提将养的缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余 下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条:第四次卖出余下的 五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼? 问题分析与算法设计题目中所有的鱼是分五次出售的,每次卖出的策略相同;第j次卖剩下的(j+i)分之一再加 (j+i)条。第五次将第四次余下的“条全卖了。假定第j次鱼的总数为X,则第j次留下:X-(x+l)/(j+l)当第四次出售完毕时,应该剩下11条。若X满足上述要求,则X就是题目的解。应当注意的是:(x+l)/(j+l)”应满足整除条件。试探X的初值可以从23开始,试探的步长 为2,因为X的值一定为奇数。 程序说明与注释#includeint main()int i, j,n=O,x; /*n 为标志变量/for(i=23;n=0;i+=2) /*控制试探的步长和过程/(for(j=l, x=i; j=ll; j+) /完成出售四次的操作/if(x+l)%(j+l)=O) /若满足整除条件则进行实际的出售操作/ x-=(x+l)/(j+l);else x=0;break; /*否则停止计算过程/if(j=5&x=U) /若第四次余下11条则满足题意/(printf (There are %d fishes at first. n, i) ; /输出结果/n=l; /*控制退出试探过程/ 运行结果There are 59 fishes at first.17.平分七筐鱼摘要甲、乙、丙三位鱼夫出海打鱼,他们随船带了 21只萝筐。当晚返航时,他们发现有七 筐装满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测 认为七个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下, 怎样将鱼和筐平分甲、乙、丙三位鱼夫出海打鱼,他们随船带了 21只梦筐。当晚返航时,他们发现有七筐装 满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测认为七 个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将 鱼和筐平分为三份?问题分析与算法设计根据题意可以知道:每个人应分得七个管筐,其中有3. 5筐鱼。采用个3*3的数组a来表 示三个人分到的东西。其中每个人对应数组a的一行,数组的第。列放分到的鱼的整筐数, 数组的第1列放分到的半筐数,数组的第2列放分到的空筐数。由题目可以推出:。数组的每行或每列的元素之和都为?;对数组的行来说,满筐数加半筐数=3. 5;每个人所得的满筐数不能超过3筐;每个人都必须至少有1个半筐,且半筐数一定为奇数对于找到的某种分鱼方案,三个人谁拿哪份都是相同的,为了避免出现重复的分配方案, 可以规定:第二个人的满筐数等于第一个人的满筐数;第二个人的半筐数大于等于第一个人 的半筐数。程序说明与注释#includeint a 3 3, count;int main()(int i, j, k, m, n, flag;printf(?,It exists possible distribtion plans:n);for(i=0;i=3;i+) /试探第一个人满筐a 的值,满箧数不能3*/ (a00=i;for(j=i:j=7-i&j3*/(alO=j;if (a2 0=7-0。)3)(:(打亜;/*第三个人满筐数不能3*/if (a2 0=前一个人,以排除重复情况/ for(k=l;k=5;k+=2) /试探半筐a0 1的值,半筐数为奇数/ a0l=k;for(m=l;m7-k;m+=2) /试探半筐all的值,半筐数为奇数/al l=m;a2l=7-k-m;for(flag=l, n=0;flag&n3;n+)/判断每个人分到的鱼是3. 5筐,flag为满足题意的标记变量/if (an 0+an l7&an 0*2+an 1=7)an 2=7-an 0-an 1; /*计算应得到的空筐数量/else flag=0; /*不符合题意则置标记为0/if(flag) printf(No. %d Full basket Semi-basket Emptyn, +count); for (n=0;n3;n+)printf( fisher %c: %d %d %dn, A +n, an 0, an 1, an 2);运行结果 It exists No. 1 Full fisher A: fisher B: fisher C: No. 2 Full fisher A: fisher B: fisher C:possible distribution plans: basket Semi-basket Empty 1 5 1 3 1 3 3 1 3basket Semi-basket Empty2 3 23 3 24 1 319. 8除不尽的自然数摘要个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后 得到个商为a又知这个自然数被17除余4,所得的商被!7除余15,最后得到个商是 a的2倍。求这个自然数。根据题意,可设最后的商为i(i从0开始取值),用逆推法可以 列出关系式个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到 个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到个商是a的 2倍。求这个自然数。问题分析与算法设计根据题意,可设最后的商为i(i从0开始取值),用逆推法可以列出关系式:(i*8+7)*8)+1)*8+1=(2*i*17)+15)*18+4 再用试探法求出商i的值。程序说明与注释#includeint main () int i;for(i=0;i+) /试探商的值/if(i*8+7) *8+1) *8+1= (34*i+15) *17+4) /逆推判断所取得的当前i值是否满足关系式/若满足则输出结果/printf(*The required number is: %dn”, (34*i+15)*17+4);break; /退出循环/运行结果The required number is:199320. 一个奇异的三位数摘要个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是个三位 数,且这两个三位数的数码正好相反,求这个三位数。根据题意可知,七进制和九进制表 示的这全自然数的每一位一定小于7,可设其七进制数形式为kji,然后设其九进制表示形 式为ijko个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是个三位数,且 这两个三位数的数码正好相反,求这个三位数。问题分析与算法设计根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于7,可设其七进制数形 式为kji(i、j、k的取值分别为16),然后设其九进制表示形式为ijk。程序说明与注释#includeint main ()int i, j, k;for(i=l;i7;i+)for(j=0;j7;j+)for(k=l;k7;k+)if(i运行结果The special number with 3 digits is:503(7)=305(9)=248(10)9*9+j*9+ki+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);)21. 4位反序数摘要设N是个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来 形成的整数。可设整数N的千、百、十、个位为i、j、k、1,其取值均为09,则满足关 系式(i运行结果The number satisfied states condition is:1089103+j*102+lk+l)*9=(l*103+k*102+lj+i)的式 j、k、1 即构成 N。设N是个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成 的整数。例如:1234的反序数是4321。问题分析与算法设计可设整数N的千、百、十、个位为i、j、k、1,其取值均为09,则满足关系式: (i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的i、j、k、1即构成N。程序说明与注释#includeint mainO(int i;for(i=1002;illll;i+) /穷举四位数可能的值/if(i%10*1000+i/10%10*100+i/100%10*10+i/1000=i*9)/*判断反序数是否是原整数的9倍/printf(The number satisfied stats condition is: %dn”,i);/若是则输出/
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!