欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    c语言经典算法精品资料.doc

    • 资源ID:96699052       资源大小:549KB        全文页数:129页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c语言经典算法精品资料.doc

    目 录第一章 数值处理1.1 19头牛11.2 分钱11.3 儿子做题11.4 乐队人数21.5 靶子趣谈21.6 里程碑31.7 位等差41.8 岁数51.9 打碎的鸡蛋61.10 分糖71.11 奖牌71.12 同等遗产81.13 菜票问题81.14 出售金鱼91.15 取苹果101.16 狐狸追兔101.17 报数111.18 娶公主121.19 递增牛群121.20 徒子徒孙13第二章 图形输出2.1 左旋方阵 152.2 旋方阵 162.3 螺阵 182.4 蛇阵212.5 对角矩阵 222.6 魔方阵 242.7 倒三角 252.8 函数曲线 272.9 菱形1 292.10 菱形2 302.11 杨辉三角302.12 字母矩形322.13 字母菱形34第三章 数据处理3.1 勾股数363.2 求素数363.3 亲密数363.4 三非零数373.5 平方和373.6 数目平方383.7 四方定理393.8 求最值403.9 数字反序403.10 数值1403.11 数值问题413.12 十进制转为二进制423.13 十六进制转为十进制423.14 进制 2433.15 尾零个数443.16 求7的34次方 453.17 印度国王453.18 找最值463.19 连续合数473.20 特殊数列473.21 同和偶数483.22 环状素数493.23 回文素数对503.24 求双百513.25 素数算式523.26 外围之和53第四章 过程模拟544.1 称小球544.2 字符滑落564.3 抽奖564.4 选举574.5 算术 1584.6 算术 2594.7 分牌604.8 八皇后634.9 摆棋子664.10过河 694.11 走迷宫71第五章 算式求值 755.1 整数相减765.2 大数相减775.3 实数之和785.4 大数相加805.5 括号配对815.6 大、中、小括号配对835.7 数字重组835.8 计算 1855.9 优先级855.10 计算 2865.11 计算器885.12 化简90第六章 文件、字符、指针处理6.1 自定义TYPE 926.2 记录排名926.3 记录排序946.4 排名次956.5 自定义COMP976.6 自定义COPY 986.7 统计字母996.8 统计行数单词996.9 语法检查1006.10 长度个数1016.11 统计单词1026.12细胞数目1036.13最长路径106第七章 数字组合1087.1 特殊矩阵 1087.2 对角线和 1097.3 矩阵鞍点 1107.4 特殊三角形 1117.5 古诗算式 1117.6 填数 2 113第一章 数值处理1.1 有一个老人在临死前把三个儿子叫到跟前,告诉他们把19头牛分了,老大分1/2,老二分1/4,老三分1/5,说完就死了.按当地习俗,不能宰牛.问三个儿子各能分多少?(19头牛.c) (答案:10,5,4) 分析:由于19与2、4、5都不能整除,所以就不能用平常的方法来解决这个 问题。但是,如果仔细一点就可以发觉到:1/2+1/4+1/5=19/20,而牛的数量刚 好为19。由此,就不难得出该问题的解决办法: main() int i; for(i=1;i<=10;i+) if(i+i/2+2*i/5=19) printf("三个儿子分别分%d头,%d头和%d头.n",i,i/2,2*i/5); getch(); 1.2 一元钱分成1分、2分、5分的,问有多少种分法?(分钱.c) (答案:541种.) main() int i,j,sum=0; for (i=0;i<=20;i+) /*变量i为5分钱的数量*/ for (j=0;j<=(100-5*i)/2;j+) /*变量j为2分钱的数量,其余的就为一分钱*/ sum+; printf("共有%d种分法.",sum); getch(); =#include <stdio.h>int main()int f;int t;int count=0;for(f = 0 ; f <= 20 ; f+)for(t = 0 ; t <= 50 ; t+)if(f * 5 + t * 2 <= 100)count+;printf("%dn",count);return 0;=1.3 父亲对儿子说:"做对一道题给8分,做错一道题扣5分."做完26题后,儿子得0分,问儿子做对了几题?(儿子做题.c) (答案10,16) #include"stdio.h" main() int i; for(i=0;i<=26;i+) if (8*i-5*(26-i)=0) /*i为作对的题数,26-i为作错的题数*/ printf("n做对了%d道题,做错了%d道题.",i,26-i); getch(); 1.4 在爱尔兰守神节那天,举行每年一度的庆祝游戏,指挥者若将乐队排成10人、9人、8人、7人、6人、5人、4人、3人和2人时,最后的一排总是缺少一个人,那些人想这个位置大概是给数月前死去的乐队成员凯西还留着位置。指挥者见到总缺一人恼火了,叫大家排成一列纵队前进。假定人数不超过7000人,那么乐队究竟有多少人?(乐队人数.c) (答案:2519人。) main() int i,j; for (i=9;i<=7000;i+=10) /*用最大的步长取最外层循环变量值*/ for (j=9;j>=2;j-) /*模拟排队过程*/if (i+1)%j!=0) break; /*不满足条件则重新取值*/ if (j=1) /*已满足条件*/printf("乐队共有%d人。",i); exit(0); 1.5 战士们做了一个靶子,靶子分五格,中心是39环,从左起顺时针是23、17、24 、16。 战士小李射了若干枪,每一次都击中靶子,并且正好是100环。问他打了几枪?每枪 多小环?(靶子趣谈.c) (答案:6枪,环数为17,17,17,17,16,16。) main() int i,j,k,l,m,n; for (i=0;i<3;i+) /*打中39环的枪数*/ for (j=0;j<k=4;j+) /*打中24环的枪数*/ for (k=0;<=4;k+) /*打中23环的枪数*/ for (l=0;l<=6;l+) /*打中17环的枪数*/ n=100-i*39-j*24-k*23-l*17; /*余下的就为16环的枪数*/ if (n%16=0)/*不用全部循环,可以找最后一个变量在结果中必须满足什么条件,令其符合即可,本例中剩余的环数就应该被16整除,得得的数救赎16环的枪数*/ m=n/16; printf("打中39环%d个,24环%d个,23环%d个,17环%d个,16环%d个,共打了%d枪.", i,j,k,l,m,i+j+k+l+m); exit(0); getch(); 1.6 甲、乙两个城市有一条999公里长的公路。公路旁每隔一公里竖立着一个里程碑,里程碑的半边写着距甲城的距离,另半边写着距乙城的距离。有位司机注意到有的里程碑上所写的数仅用了两个不同的数字,例如000/999仅用了0和9,118/881仅用了1和8。算一算具有这种特征的里程碑共有多少个,是什么样的? (答案:40个)分析:从题意中可知每对数仅用了两个不同的数字,并且两个数字之和衡等于9.并且,每对数之和也应衡等于999.解法一: 该解法利用三重循环分别求出每个数字的各位数.因为每个数最多只用两个不同的数字,所以每个数中至少有2个数字是相同的.再根据两个不同数字之和衡等于9,不难得出如下求解过程:(里程碑1.c)main() int i,j,k,m,n=0; for (i=0;i<=9;i+) for (j=0;j<=9;j+) for (k=0;k<=9;k+) if (i=j)&&(9-i=k)|(i=k)&&(9-i=j)|(j=k)&&(9-k=i)|(i=j)&&(j=k) m=i*100+j*10+k; printf("%d/%d ",m,999-m); n+; printf("n具有这种特征的里程碑共有%d个.",n); 解法二:仔细分析题意,可得出如下结论:假设两个数字分别为a与b,则b=9-a; 由排列组合原理可知,由a和b所能组成的三位数对如下: aaa/bbb;aab/bba;aba/bab;abb/baa; bbb/aaa;bba/aab;bab/aba;baa/abb.其中,每一对数之和衡等于999(如:aab+bba=999),并且后四对数为前面四对数中每两个数的简单对调(如:aab/bbabba/aab).由此,便可得出如下求解过程:main()int i,j,k,n=0,a4; for (i=0;i<5;i+) j=9-i; a0=i*111; a1=i*110+j; a2=i*101+j*10; a3=1*100+j*11; for (k=0;k<4;k+) printf("%d: %d/%d,",+n,ak,999-ak); printf("%d: %d/%d,",+n,999-ak,ak); printf("n具有这种特征的里程碑共有%d个",n); 1.7 一个四位数,其千位、百位、十位数字依次组成等差数列,百位上的数字是个位、千位数字的等比中项,把该四位数的数字反序所得数与原数的和为11110。求原四位数。(位等差.c) (答案:2468或5555。) 分析:设该四位数为abcd,则由"其千位、百位、十位数字依次组成等差数列"可得(其中x为等差系数): b=a+x (1) c=a+2*x (2)再由"百位上的数字是个位、千位数字的等比中项"可得:a*d=b*b (3)由(1)、(3)可得:a*d=(a+x)*(a+x) (4)main() int i,j; clrscr(); printf("原四位数为:"); for (i=0;i<=9;i+) for (j=(i-9)/3;j<=(9-i)/3;j+) if (i+j)*(i+j)=i*(i+3*j)&&(2*i+3*j)*(1000+100+10+1)=11110) printf("%d ",(i*1000+(i+j)*100+(i+2*j)*10+(i+3*j); 1.8 一位学生说“我的岁数的三次方是个四位数,四次方是个六位数。要组成我岁数的三次方和四次方,需要用遍十个数字。”请问他多少岁? 解法一: 该解法先分解出岁数的三次方和四次方的每一位,然后再判断这些数字是 否重复.(岁数1.c) main() int i,j,k,a10; long k3,k4; for (k=10; k<40; k+) k3=k*k*k; k4=k3*k; if (k3/1000>0 && k3/1000<10 && k4/100000>0 && k4/100000<10 ) a0=k3/1000; a1=k3/100-a0*10; a2=k3/10-a0*100-a1*10; a3=k3%10; a4=k4/100000; a5=k4/10000-a4*10; a6=k4/1000-a4*100-a5*10; a7=k4/100-a4*1000-a5*100-a6*10; a8=k4/10-a4*10000-a5*1000-a6*100-a7*10; a9=k4%10; for(i=0; i<10-1; i+) for(j=i+1;j<10; j+) if (ai=aj) break; if (i=9 && j=10) printf("岁数为:%dn",k); break; 解法二:该解法与解法一比起来在判断数字是否重复方面有其独特之处,其在判断函数中用一数组a10来分别表示是否出现该数组下标所对应的数字,例如:若a0=1表示零的个数为零,若a0=0,表示此前已出现过数字0。 int check(long a1,long a2) int i,j,a10; for (i=0;i<=9;i+) ai=1; for (i=0;i<=3;i+,a1/=10) if (aa1%10) aa1%10=0;/*判断当前最后一位是否已出现过,若没有,则将其清零*/ else return(0); /*若aa1%10!=0,表示该数字已重复,返回0*/ for (i=0;i<=5;i+,a2/=10) if (aa2%10) aa2%10=0; else return(0); return (1); main() int i,k; long k3,k4; for (k=10; k<40; k+) k3=k*k*k; k4=k3*k; if (k3/1000>0 && k3/1000<10 && k4/100000>0 && k4/100000<10 ) if (check(k3,k4) printf("岁数为:%dn",k); getch(); exit(0); 1.9 某女士手里拎了一篮鸡蛋,从她身边奔跑而过一匹惊马,吓了她一跳,结果把篮里的鸡蛋,她说两个一数,三个一数,四个一数,五个一数时,余数分别为1,2,3和4。问篮里原有多少个鸡蛋?(打碎的鸡蛋.c) (答案:59个。) 分析:解决这类问题的要点就是找到一个最大的数作为步长,以减少其循环次数,该例题的最大数为5,故应以5为步长。 main() int i; for (i=9;i+=5) if (i%5=4)&&(i%4=3)&&(i%3=2)&&(i%2=1) printf("篮里原有%4d个鸡蛋.",i); exit(0); 1.10 新年晚会老师给大家分糖,手端着一盘糖,让第一个同学先拿1块糖,再把盘中的糖分1/7给他;然后让第二个同学拿2块糖,再把盘中的糖的1/7给他;第三个同学拿3块糖后,仍把盘中的糖的1/7给他。照这个办法分下去,最后一个同学自己拿完糖后,糖恰好分完,而且每个人分到的糖块数相同。问共有几人?每人分几块糖?(分糖.C)分析:由“最后一个同学自己拿完糖后,糖恰好分完”以及前面的条件可知,最后一个同学所拿的糖的数量刚好等于人数。再根据其他条件可知,第i个同学所拿的糖的数量为所剩下糖的1/6加上i,并且每个同学所拿的糖的数量必为整数,即可得出如下求解过程: main() int t=0,m,n,i,j; for (m=6;!t;m+=6) t=1;n=m; /*n为最后一个同学所拿到的糖的数量(即 人数),t=1假设当前n满足条件*/ for (i=m-1;(i>=1)&&t;i-) j=n/6+i; /*第i个同学分到的糖的数量*/ n=n/6*7+i; /*第i个同学分到糖之前所剩的糖的数量*/ if (j!=m) t=0; /*每个人分到的糖块数相同.不满足就退 出模拟过程对人数重新取值*/ printf ("%6d%6dn",m-6,m-6); 1.11 运动会连续开了N天,一共发了M枚奖牌。第一天发了一玫再加上剩下的1/7,即第一天发了1+(M-1)/7枚;第二天发了两枚再加上剩下的1/7,以后每天按此规律发奖牌,最后一天,第N天,刚好发完剩下的N枚奖牌。问运动会开了几天?一共发了几枚奖牌?(奖牌.C) main() int t=0,m,n,i,j; clrscr(); for (i=2;!t;i+) m=i; t=1; /*变量i为天数,m为剩余奖牌数,t=1假设该天满足条件*/ for (j=i-1;j>=1;j-) /*从最后一天开始倒着往前模拟每天的发放奖牌过程*/ if (m%6) /*若有一天不满足条件就退出模拟过程对天数重新取值*/ t=0; break; m=m/6*7+j; printf("一共开了%d天,共发了%d枚奖牌。n",i-1,m); 1.12 父亲临终时,让按下列方式分配他的遗产:大儿子分得100克朗和剩下财产的1/10,二儿子分得200克朗和剩下财产的1/10,三儿子分得300克朗和剩下财产的1/10。依此类推,最后发现这种分法好极了,因为所有儿子分得的钱数恰好相等。问他共有几个儿子?每个儿子分得多少遗产?(同等遗产.c) (答案:9个儿子,每人900克朗) 注:该题的算法可参照"分糖". main() int i,j,k,m,n; for (n=600;n=n+10) k=100+(n-100)/10; m=n-k; for (i=2;m>0;i+) if (m%10!=0)|(k!=i*100+(m-i*100)/10) break; else m=(m-i*100)-(m-i*100)/10; if (m=0) printf("他共有%d个儿子,每个儿子分得%d克朗.",i,k); getch(); exit(0); 1.13 两衣袋中装满了一角与二角五分的菜票,但还不到20元,左右两个衣袋中的钱 数相等。左口袋中每种菜票的数目相同,而右口袋中每种菜票的钱数相等,你能算出两口袋中各菜票的数目吗?(菜票问题.c) (答案:左:10*20+25*20=700;右:10*35+25*14=700) 分析:设左口袋中每种菜票的数量都为x;右口袋中每种菜票的钱数都为 y,一角菜票的张数为m,二角五分菜票的张数为n;则可得出如下方程: 10*x+25+x=2*y (1) 10*m+25*n=2*y (2) 10*m=25*n (3) 由(3)式可得: n=m*2/5 (4) 由(1)(2)(3)式可得: x=m*20/35 (5) 根据(4)、(5)两式可得如下求解过程: main() int i; for (i=5;i<=50;i+=5) if (i*10*2%35=0) printf("%4d%4d%4d",i*20/35,i,i/5*2); getch(); 1.14 出售金鱼者决定将缸里的金鱼分五次全部卖出:第一次卖出全部金鱼的一半加 二分之一条金鱼;第二次卖出剩余金鱼的三分之一加三分之一条金鱼;第三次 卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五公之一 加五分之一条金鱼。现在还剩下11条金鱼,当然出售金鱼时不能切开或者有任 何破损的,问这鱼缸里原有多少条金鱼?(出售金鱼.c) (答案:鱼缸里原有59条金鱼。) main() int m,i=1,j,n=13; for (m=13;(n!=11)|(i<=4);m+=2) /*变量m为原有金鱼的数量,n为卖完i次之后所剩金鱼的数量。只有n=11并且i>4 才退出该循环。*/ n=m; for (i=1;i<=4;i+) /*模拟前四次卖金鱼的过程*/ if (n%(i+1)=i) /*符合要求就继续*/ n=n*i/(i+1); else break; /*否则就重新取值*/ printf("鱼缸里原有%d条金鱼。",m-2); 1.15 有箱苹果,编号从1#.10#,分别装有1,2,4,8,16,32,64,128,256和512个苹果。要取苹果若干(1000以内任意自然数),而不打开箱子,应该取哪几箱呢?(取苹果.C) 分析:由题意可知,箱的编号m与箱中苹果个数n存在如下对应关系:m等于2的n-1次幂. 根据十进制数与二进制数之间互相转化的原理可得出如下求解过程: main() int a10,i,sum; a0=1; for (i=1;i<10;i+) ai=ai-1*2; /*初始化每个箱所装的苹果数(相当于每个2进制位所对应的十进制数)*/ printf("请输入所要拿的苹果数:"); scanf("%d",&sum); for (i=9;(i>=0)&&(sum!=0);i-) if (sum>=ai) printf("%d# ",i+1); sum=sum-ai; 1.16 山上有10个洞,呈顺时针排列,有一只狐狸从第10号洞开始按第n次跨越n个洞的规则追 兔子,可是追了一天也没有抓到兔子,求兔子可能在哪几个洞中?(狐狸追兔.c) 分析:根据题意,只需模拟狐狸跨越100次,就可得到狐狸未经过的洞. main() static int a10,i; clrscr(); for(i=0;i<100;i+) ai*(i+1)/2%10=1; /*狐狸有经过的洞赋1*/ printf("兔子可能在"); for(i=0;i<10;i+) if(!ai) printf("%d#洞 ",i); getch(); 1.17 有M个人围成一圈,每人指定一个号码(1,2,3.),从第一个人数起,数 到N时这个人就从圈里出来,再继续数1,2,3.N,数到第N个又出来。凡 从圈里出来的人的位置就不再数,直到只剩一个人为止。请指出从圈里出 来的人的次序。 如,输入: 10 4 则屏幕上输出: 4 8 2 7 3 10 9 1 6 5 (报数.C) 分析:这类

    注意事项

    本文(c语言经典算法精品资料.doc)为本站会员(封****n)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开