C++趣味算法

合集下载

100个经典的C算法

100个经典的C算法

100个经典的C算法.txtPOJ上做做ACM的题语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....程序源代码:main(){long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++){ printf("%12ld %12ld",f1,f2);if(i%2==0) printf("\n");/*控制输出,每行四个*/f1=f1+f2;/*前两个月加起来赋值给第三个月*/f2=f1+f2;/*前两个月加起来赋值给第三个月*/}}上题还可用一维数组处理,you try!题目:判断101-200之间有多少个素数,并输出所有素数。

程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

程序源代码:#include "math.h"main(){int m,i,k,h=0,leap=1;printf("\n");for(m=101;m<=200;m++){ k=sqrt(m+1);for(i=2;i<=k;i++)if(m%i==0){leap=0;break;}if(leap) {printf("%-4d",m);h++;if(h%10==0)printf("\n");}leap=1;}printf("\nThe total is %d",h);}题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

C语言趣味程序百例

C语言趣味程序百例

C语言趣味程序百例(1):绘制余弦曲线public class test1{public static void main(String args[]){double y;double x, m;for (y=1;y>-1;y-=0.1) {m= Math.acos(y) * 10;for (x = 1; x < m; x++)System.out.print(" ");System.out.print("*");for (; x < 62 - m; x++)System.out.print(" ");System.out.println("*");}}}C语言趣味程序百例(3):绘制圆public class test3{public static void main(String args[]) {double y;double x, m;for(y=10;y>=-10;y--){m=2*Math.sqrt(100-y*y);for(x=1;x<30-m;x++)System.out.print(" ");System.out.print("*");for(;x<30+m;x++)System.out.print(" ");System.out.println("*");}}}import java.util.*;public class test4{public static void main(String args[]){int max=0;int min=100;double sum=0;for(int i=1;i<=10;i++){System.out.printf("请输入第"+i+"个分数:\n");Scanner reader=new Scanner(System.in);int x=reader.nextInt();sum+=x;if(x> max) max=x;if(x< min) min=x;}System.out.println("无效的最高分和最低分:"+max+" , "+min);System.out.println("最后选手的得分是:"+(sum-max-min)/8.0);}}public class test5{public static void main(String args[]){for (int i=999;i>99;i--) {if (555555%i==0) {System.out.println("最大约数="+i);return;}}}}C语言趣味程序百例(12):抓交通肇事犯public class test12{public static void main(String args[]){int k;for(int i=1;i<=9;i++){for(int j=0;j<=9;j++){if(i!=j){k=i*1000+i*100+j*10+j;for(int c=31;c< 100;c++){if(c*c==k)System.out.println("肇事车牌号是"+k);}}}}}}public class test38{public static void main(String args[]){int count = 0;for (int i = 0; i <= 100; i++)for (int j = 0; j <= 50; j++)for (int k = 0; k <= 20; k++) {if (i + j * 2 + k * 5 == 100) {System.out.println(count++ + ":" + i + "-" + j + "-" + k);}}}}public class test40{public static void main(String args[]){for (int i = 0; i <= 3; i++)for (int j = 0; j <= 3; j++) {if (8 - i - j <= 6)System.out.println("Res=" + i + " White=" + j + " Black="+ (8 - i - j));}}}C语言趣味程序百例(54):博士的难题2public class test54{public static void main(String args[]){for (int a = 1; a <= 3; a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)if ((a != b && b != c && a != c)&& (a == 1 && b == 1 || a == 2 && b != 1 || a == 3)&& (b == 1 && b == 3 || b == 2 && b != 3 || b == 3)&& (c == 1 && b == 2 || c == 2 && b != 2 || c == 3)) {System.out.println("1表示诚实族,2表示说谎族,3表示两面族");System.out.println("a=" + a);System.out.println("b=" + b);System.out.println("c=" + c);}}}C语言趣味程序百例(62):奇特立方体public class test62{public static void main(String args[]){int x[]=new int[8];for(int i=0;i<8;i++){x[i]=Integer.parseInt(args[i]);}new test62().cube62(x);}public void cube62(int x[]) {int n = 8;boolean success=false;for (int a = 0; a < n; a++)for (int b = 0; b < n; b++)for (int c = 0; c < n; c++)for (int d =0; d < n; d++)for (int e = 0; e < n; e++)for (int f = 0; f < n; f++)for (int g = 0; g < n; g++)for (int h =0; h < n; h++) {if (notEquls(new int[] { x[a],x[b], x[c],x[d],x[e],x[f],x[g],x[h]})) {if(cube62(x[a],x[b], x[c], x[d], x[e], x[f], x[g], x[h])) return;}}if(success!=true) System.out.println("不能构成奇妙立方体");;}public boolean cube62(int a, int b, int c, int d, int e, int f, int g, int h) {boolean success=false;int s = a + b + c + d;if (s == e + f + g + h)if (s == a + b + e + f)if (s == c + d + g + h)if (s == a + c + e + g)if (s == b + d + f + h) {System.out.println("能构成奇特立方体");System.out.print(" a=" + a);System.out.print(" b=" + b);System.out.print(" c=" + c);System.out.print(" d=" + d);System.out.print(" e=" + e);System.out.print(" f=" + f);System.out.print(" g=" + g);System.out.println(" h=" + h);System.out.println("构成的奇特立方体如下图:");System.out.println(" e/----------/f");System.out.println(" a/----------/b|");System.out.println(" | | | |");System.out.println(" | | | |");System.out.println(" | | | |");System.out.println(" |g/--------|-/h");System.out.println(" c/----------/d");return true;}return success;}public boolean notEquls(int[] a) {if (a == null || a.length == 0 || a.length == 1)return true;for (int i = 0; i < a.length; i++) {for (int j = 0; j < a.length; j++) {if (a[i] == a[j] && i != j) {return false;}}}return true;}}public class test49{public static void main(String args[]){for (int a = 0; a <= 1; a++)for (int b = 0; b <= 1; b++)for (int c = 0; c <= 1; c++)for (int d = 0; d <= 1; d++)for (int e = 0; e <= 1; e++)for (int f = 0; f <= 1; f++) {if (a + b >= 1&& a + d <= 1&& a + e + f == 2&& (b + c == 0 || b + c == 2)&& (c + d == 1)&& ((d == 0 && e == 0) || (d == 1 ))) {System.out.println("0是不去,1是去");System.out.println("a="+a);System.out.println("b="+b);System.out.println("c="+c);System.out.println("d="+d);System.out.println("e="+e);System.out.println("f="+f);}}}}import java.io.*;public class test10{public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input int:");String s=br.readLine();int val=Integer.parseInt(s);System.out.println(getBits(val));}public static String getBits(int value){int displayMask=1<<31;StringBuffer buf=new StringBuffer(35);for(int c=1;c<=32;c++){buf.append((value & displayMask)==0? '0':'1');value<<=1;if(c%8==0)buf.append(' ');}return buf.toString();}}public class test9{public static void main(String args[]){int n=Integer.parseInt(args[0]);System.out.println("N="+n);for(int i=0;i<=n;i++){for(int j=0;j< 12-i;j++) System.out.printf(" ");for(int j=1;j< i+2;j++) System.out.printf("%6d",c(i,j));System.out.println();}}public static int c(int x,int y){int z;if((y==1)||(y==x+1)) return 1;z=c(x-1,y-1)+c(x-1,y);return z;}}C语言趣味程序百例(79):随机数求圆周率public class test79{public static void main(String args[]){double all=10000000;double l=1000000;double pai=0;double in=0;double x=0,y=0;for (int i=0;i<all;i++) {x=(Math.random()*l);y=(Math.random()*l);if(x*x+y*y<l*l)in++;}pai=(in/all*4);System.out.println("Times/All="+in+"/"+all+" "+"π~="+pai);}}。

c语言趣味编程例题

c语言趣味编程例题

c语言趣味编程例题
以下是一些有趣的C语言编程例题,供您参考:
1. 猜数字游戏
编写一个猜数字的小游戏,让用户从0到100之间随机生成一个数字,用户可以多次猜测,每次猜测后程序会提示用户猜大还是猜小,直到猜中为止。

2. 反转字符串
编写一个函数,接受两个参数,分别为字符串和字符串长度,返回一个新的字符串,该字符串是原字符串的反转。

3. 计算阶乘
编写一个函数,接受一个整数n作为参数,返回n的阶乘。

4. 编写一个简单的计算器
编写一个简单的计算器,可以进行加、减、乘、除四则运算,支持整数和浮点数运算。

5. 编写一个简单的图形界面应用程序
使用C语言编写一个简单的图形界面应用程序,实现一个窗口,其中
包含一个按钮和一个标签。

当用户点击按钮时,标签的文本将更改为“Hello, World!”。

6. 编写一个简单的文本编辑器
编写一个简单的文本编辑器,支持打开、保存和删除文件,并能够在文本中进行插入、删除和替换操作。

7. 编写一个简单的游戏
编写一个简单的游戏,例如俄罗斯方块、扫雷或贪吃蛇等,可以使用C语言编写游戏引擎,然后使用图形库来创建游戏界面。

这些例题可以帮助您练习C语言编程技能,并提高您的编程能力。

有趣的c语言代码例子

有趣的c语言代码例子

有趣的c语言代码例子
1.猜数字游戏:编写程序生成一个介于1到100之间的随机数,用户输入猜测的数字直到猜对为止,程序会给出猜测数字相对于答案的大小关系提示(例如“猜测数字太大”或“猜测数字太小”)。

2. 打地鼠游戏:在屏幕上生成随机的地鼠图案,用户用鼠标点击击打地鼠以获得分数,随着时间的推移地鼠速度逐渐加快。

3. 贪吃蛇游戏:编写程序生成一个贪吃蛇,蛇头可以用键盘控制移动,当蛇吃到食物时身体长度增加,当蛇头碰到墙壁或自己的身体时游戏结束。

4. 数独游戏:生成一个数独谜题,用户通过键盘输入数字来填充空白格子,当谜题填写完整且符合数独规则时游戏结束。

5. 神经网络:使用C语言实现一个简单的神经网络,可以用来识别手写数字或其他模式识别任务。

6. 数据结构:实现一个栈或队列数据结构,可以用来解决各种实际问题。

7. 图像处理:使用C语言读取图像文件并进行简单的处理,例如灰度化、边缘检测或图像滤波等。

8. 加密解密:实现一个简单的加密解密算法,例如Caesar密码或RSA加密算法。

9. 排序算法:实现常见的排序算法,例如冒泡排序、插入排序或快速排序等。

10. 计算机模拟:使用C语言模拟各种实际问题,例如天气预报、
股票交易或人口统计等。

几十道有趣c程序设计方案题

几十道有趣c程序设计方案题

几十道有趣的c程序设计题题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....2.程序源代码:main(){long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++){ printf("%12ld %12ld",f1,f2);if(i%2==0) printf("\n");/*控制输出,每行四个*/f1=f1+f2; /*前两个月加起来赋值给第三个月*/f2=f1+f2; /*前两个月加起来赋值给第三个月*/}}=========================================================== ===【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

2.程序源代码:#i nclude "math.h"main(){int m,i,k,h=0,leap=1;printf("\n");for(m=101;m<=200;m++){ k=sqrt(m+1);for(i=2;i<=k;i++)if(m%i==0){leap=0;break;}if(leap) {printf("%-4d",m);h++;if(h%10==0)printf("\n");}leap=1;}printf("\nThe total is %d",h);}=========================================================== ===【程序3】题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

妙趣横生的算法(C语言实现)

妙趣横生的算法(C语言实现)

02
基础算法
冒泡排序
通过相邻元素的比较和交换,将最大元素逐渐"冒泡"至数组末尾。
在未排序的序列中找到最小元素,将其放到排序序列的起始位置。
将未排序的元素插入到已排序序列的合适位置,保证每次插入后序列依然有序。
选择一个基准元素,将序列中小于基准的元素放到左边,大于基准的元素放到右边,然后递归地对左右子序列进行快速排序。
旅行商问题在优化调度、物流配送等领域都有广泛的应用,如航空公司的航线规划、物流公司的配送路线规划等。
总结词
详细描述
应用场景
THANKS
感谢观看
妙趣横生的算法(c语言实现)
xx年xx月xx日
目录
contents
引言基础算法进阶算法高手算法实战案例分析
01
引言
算法是一系列解决问题或完成特定任务的明确指令。
算法应具有输入、输出和可重复性。
算法的效率和正确性是关键。
什么是算法
1
算法的重要性
2
3
算法是计算机科学的核心,是解决复杂问题的关键。
采用分治策略,将序列分成若干个子序列,分别进行排序,然后将排好序的子序列合并成一个有序序列。
排序算法
选择排序
快速排序
归并排序
插入排序
线性地搜索数组中每个元素,直到找到目标元素或搜索完整个数组。
顺序搜索
在已排序的数组中,通过不断缩小搜索范围来找到目标元素。
二分搜索
搜索算法
最短路径算法
用于求解图中两点之间的最短路径问题,如Dijkstra算法和Bellman-Ford算法。
回溯算法
总结词
一种模拟生物进化过程的优化算法,通过选择、交叉、变异等操作来产生新的候选解,并逐步接近最优解。

C语言经典算法大全(可编辑)

C语言经典算法大全(可编辑)

C语言经典算法大全C语言经典算法大全老掉牙河内塔费式数列巴斯卡三角形三色棋老鼠走迷官一老鼠走迷官二骑士走棋盘八个皇后八枚银币生命游戏字串核对双色三色河内塔背包问题Knapsack Problem数运算蒙地卡罗法求 PIEratosthenes筛选求质数超长整数运算大数运算长 PI最大公因数最小公倍数因式分解完美数阿姆斯壮数最大访客数中序式转后序式前序式后序式的运算关于赌博洗扑克牌乱数排列Craps赌博游戏约瑟夫问题Josephus Problem 集合问题排列组合格雷码Gray Code产生可能的集合m元素集合的n个元素子集数字拆解排序得分排行选择插入气泡排序Shell 排序法 - 改良的插入排序Shaker 排序法 - 改良的气泡排序Heap 排序法 - 改良的选择排序快速排序法一快速排序法二快速排序法三合并排序法基数排序法搜寻循序搜寻法使用卫兵二分搜寻法搜寻原则的代表插补搜寻法费氏搜寻法矩阵稀疏矩阵多维矩阵转一维矩阵上三角下三角对称矩阵奇数魔方阵4N 魔方阵2 2N1 魔方阵 1河内之塔说明河内之塔 Towers of Hanoi 是法国人MClaus Lucas 于1883年从泰国带至法国的河内为越战时北越的首都即现在的胡志明市1883年法国数学家 Edouard Lucas曾提及这个故事据说创世纪时Benares有一座波罗教塔是由三支钻石棒Pag所支撑开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘Disc并命令僧侣将所有的金盘从第一根石棒移至第三根石棒且搬运过程中遵守大盘子在小盘子之下的原则若每日仅搬一个盘子则当盘子全数搬运完毕之时此塔将毁损而也就是世界末日来临之时解法如果柱子标为ABC要由A搬至C在只有一个盘子时就将它直接搬至C当有两个盘子就将B当作辅助柱如果盘数超过2个将第三个以下的盘子遮起来就很简单了每次处理两个盘子也就是A- BA - CB- C这三个步骤而被遮住的部份其实就是进入程式的递回处理事实上若有n个盘子则移动完毕所需之次数为2n - 1所以当盘数为64时则所需次数为264- 1 1XXXXXXXXXX709551615为505390248594782e16年也就是约5000世纪如果对这数字没什幺概念就假设每秒钟搬一个盘子好了也要约5850亿年左右includevoid hanoi int n char A char B char Cif n 1printf "Move sheet d from c to c\n" n A Celsehanoi n-1 A C Bprintf "Move sheet d from c to c\n" n A Chanoi n-1 B A Cint mainint nprintf "请输入盘数"scanf "d" nhanoi n A B Cfn fn-1 fn-2 if n 1fn n if n 0 1includeinclude define N 20 int main voidint Fib[N] 0int i Fib[0] 0Fib[1] 1 for i 2 i N iFib[i] Fib[i-1] Fib[i-2] for i 0 i N i printf "d " Fib[i]printf "\n"return 03 巴斯卡三角形 includedefine N 12long combi int n int rint ilong p 1for i 1 i r ip p n-i1 ireturn pvoid mainint n r tfor n 0 n N nfor r 0 r n rint i 排版设定开始if r 0for i 0 i N-n i printf " "elseprintf " "排版设定结束printf "3d" combi n rprintf "\n"4Algorithm Gossip 三色棋说明三色旗的问题最早由EWDijkstra所提出Dutch Nation Flag Dijkstra为荷兰人 Three-Color Flag来称之假设有一条绳子上面有红白蓝三种颜色的旗子起初绳子上的旗子颜色并没有顺序您希望将之分类并排列为蓝白红的顺序要如何移动次数才会最少注意您只能在绳子上进行这个动作而且一次只能调换两个旗子解法在一条绳子上移动在程式中也就意味只能使用一个阵列而不使用其它的阵列来作辅助问题的解法很简单您可以自己想像一下在移动旗子从绳子开头进行遇到蓝色往前移遇到白色留在中间遇到红色往后移如下所示只是要让移动次数最少的话就要有些技巧如果图中W所在的位置为白色则W1表示未处理的部份移至至白色群组如果W部份为蓝色则B与W的元素对调而B与W必须各1表示两个群组都多了一个元素如果W所在的位置是红色则将W与R交换但R要减1表示未处理的部份减1 注意BWR并不是三色旗的个数它们只是一个移动的指标什幺时候移动结束呢一开始时未处理的R指标会是等于旗子的总数当R的索引数减至少于W的索引数时表示接下来的旗子就都是红色了此时就可以结束移动如下所示 includeincludeinclude define BLUE bdefine WHITE wdefine RED r define SWAP x y char temp \temp color[x] \color[x] color[y] \color[y] temp int main char color[] r w b w wb r b w r \0 int wFlag 0 int bFlag 0int rFlag strlen color - 1int i for i 0 i strlen color iprintf "c " color[i]printf "\n" while wFlag rFlagif color[wFlag] WHITEwFlagelse if color[wFlag] BLUESWAP bFlag wFlagbFlag wFlagelsewhile wFlag rFlag color[rFlag] REDrFlag--SWAP rFlag wFlagrFlag--for i 0 i strlen color i printf "c " color[i]printf "\n" return 05Algorithm Gossip 老鼠走迷官说明老鼠走迷宫是递回求解的基本题型我们在二维阵列中使用2表示迷宫墙壁使用1来表示老鼠的行走路径试以程式求出由入口至出口的路径解法老鼠的走法有上左下右四个方向在每前进一格之后就选一个方向前进无法前进时退回选择下一个可前进方向如此在阵列中依序测试四个方向直到走到出口为止这是递回的基本题请直接看程式应就可以理解includeinclude int visit int int int maze[7][7] 2 2 2 22 2 22 0 0 0 0 0 22 0 2 0 2 0 22 0 0 2 0 2 22 2 0 2 0 2 22 0 0 0 0 0 22 2 2 2 2 2 2 int startI 1 startJ 1 入口int endI 5 endJ 5 出口int success 0 int main voidint i j printf "显示迷宫\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"elseprintf " "printf "\n"if visit startI startJ 0 printf "\n没有找到出口\n"elseprintf "\n\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"else if maze[i][j] 1 printf "◇"elseprintf " "printf "\n"return 0int visit int i int jmaze[i][j] 1 if i endI j endJsuccess 1 if success 1 maze[i][j1]0 visit i j1if success 1 maze[i1][j] 0 visit i1 jif success 1 maze[i][j-1] 0 visit i j-1if success 1 maze[i-1][j] 0 visit i-1 j if success 1maze[i][j] 0 return success6Algorithm Gossip 老鼠走迷官说明由于迷宫的设计老鼠走迷宫的入口至出口路径可能不只一条如何求出所有的路径呢解法求所有路径看起来复杂但其实更简单只要在老鼠走至出口时显示经过的路径然后退回上一格重新选择下一个位置继续递回就可以了比求出单一路径还简单我们的程式只要作一点修改就可以了includeinclude void visit int int int maze[9][9] 2 2 2 22 2 2 2 22 0 0 0 0 0 0 0 22 0 2 2 0 2 2 0 22 0 2 0 0 2 0 0 22 0 2 0 2 0 2 0 22 0 0 0 0 0 2 0 22 2 0 2 2 0 2 2 22 0 0 0 0 0 0 0 22 2 2 2 2 2 2 2 2 int startI 1 startJ 1 入口int endI 7 endJ 7 出口 int main voidint i j printf "显示迷宫\n"for i 0 i 7 ifor j 0 j 7 jif maze[i][j] 2printf "█"elseprintf " "printf "\n"visit startI startJ return 0void visit int i int jint m n maze[i][j] 1 if i endI j endJprintf "\n显示路径\n"for m 0 m 9 mfor n 0 n 9 nif maze[m][n] 2printf "█"else if maze[m][n] 1printf "◇"elseprintf " "printf "\n"if maze[i][j1] 0 visit i j1if maze[i1][j] 0 visit i1 jif maze[i][j-1] 0 visit i j-1if maze[i-1][j] 0 visit i-1 j maze[i][j] 07Algorithm Gossip 骑士走棋盘说明骑士旅游Knight tour[所有的位置include int board[8][8] 0 int main voidint startx startyint i jprintf "输入起始点"scanf "d d" startx starty if travel startx starty printf "\n"elseprintf "\n"for i 0 i 8 ifor j 0 j 8 jprintf "2d " board[i][j]putchar \nreturn 0int travel int x int yint ktmove1[8] -2 -1 1 2 2 1 -1 -2int ktmove2[8] 1 2 2 1 -1 -2 -2 -1 测试下一步的出路int nexti[8] 0int nextj[8] 0记录出路的个数int exists[8] 0int i j k m lint tmpi tmpjint count min tmp i xj yboard[i][j] 1 for m 2 m 64 mfor l 0 l 8 lexists[l] 0 l 0 试探八个方向for k 0 k 8 ktmpi i ktmove1[k]tmpj j ktmove2[k] 如果是边界了if tmpi 0 tmpj 0 tmpi 7 tmpj 7 continue 如果这个方向可走 if board[tmpi][tmpj] 0nexti[l] tmpinextj[l] tmpj可走的方向加一个lcount l如果可走的方向为0个if count 0return 0else if count 1只有一个可走的方向所以直接是最少出路的方向min 0else找出下一个位置的出路数for l 0 l count lfor k 0 k 8 ktmpi nexti[l] ktmove1[k] tmpj nextj[l] ktmove2[k] if tmpi 0 tmpj 0tmpi 7 tmpj 7continueif board[tmpi][tmpj] 0 exists[l]tmp exists[0]min 0从可走的方向中寻找最少出路的方向 for l 1 l count lif exists[l] tmptmp exists[l]min l走最少出路的方向i nexti[min]j nextj[min]board[i][j] mreturn 18Algorithm Gossip 八皇后说明西洋棋中的皇后可以直线前进吃掉遇到的所有棋子如果棋盘上有八个皇后则这八个皇后如何相安无事的放置在棋盘上1970年与1971年 EWDijkstra与NWirth曾经用这个问题来讲解程式设计之技巧解法关于棋盘的问题都可以用递回求解然而如何减少递回的次数在八个皇后的问题中不必要所有的格子都检查过例如若某列检查过该该列的其它格子就不用再检查了这个方法称为分支修剪includeincludedefine N 8 int column[N1] 同栏是否有皇后1int rup[2N1] 右上至左下是否有皇后int lup[2N1] 左上至右下是否有皇后int queen[N1] 0int num 解答编号 void backtrack int 递回求解 intmain voidint inum 0 for i 1 i N icolumn[i] 1 for i 1 i 2N irup[i] lup[i] 1 backtrack 1 return 0void showAnswerint x yprintf "\n解答 d\n" numfor y 1 y N yfor x 1 x N xif queen[y] xprintf " Q"elseprintf " "printf "\n"void backtrack int iint j if i NshowAnswerelsefor j 1 j N jif column[j] 1rup[ij] 1 lup[i-jN] 1 queen[i] j设定为占用column[j] rup[ij] lup[i-jN] 0 backtrack i1column[j] rup[ij] lup[i-jN] 19Algorithm Gossip 八枚银币说明现有八枚银币a b c d e f g h已知其中一枚是假币其重量不同于真币但不知是较轻或较重如何使用天平以最少的比较次数决定出哪枚是假币并得知假币比真币较轻或较重解法单就求假币的问题是不难但问题限制使用最少的比较次数所以我们不能以单纯的回圈比较来求解我们可以使用决策树decision tree使用分析与树状图来协助求解一个简单的状况是这样的我们比较abc与def 如果相等则假币必是g或h我们先比较g或h哪个较重如果g较重再与a比较a是真币如果g等于a则g为真币则h为假币由于h比g轻而 g是真币则h假币的重量比真币轻 include includeinclude void compare int[] int int intvoid eightcoins int[] int main voidint coins[8] 0int i srand time NULL for i 0 i 8 icoins[i] 10 printf "\n输入假币重量比10大或小 "scanf "d" icoins[rand 8] i eightcoins coins printf "\n\n"for i 0 i 8 iprintf "d " coins[i] printf "\n"return 0void compare int coins[] int i int j int kif coins[i] coins[k]printf "\n d 较重" i1elseprintf "\n假币 d 较轻" j1void eightcoins int coins[]if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[6] coins[7]compare coins 6 7 0elsecompare coins 7 6 0else if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[0]coins[3] coins[1]coins[4]compare coins 2 5 0else if coins[0]coins[3] coins[1]coins[4] compare coins 0 4 1if coins[0]coins[3] coins[1]coins[4]compare coins 1 3 0else if coins[0]coins[1]coins[2]coins[3]coins[4]coins[5]if coins[0]coins[3] coins[1]coins[4]compare coins 5 2 0else if coins[0]coins[3] coins[1]coins[4] compare coins 3 1 0if coins[0]coins[3] coins[1]coins[4]compare coins 4 0 110Algorithm Gossip 生命游戏说明生命游戏game of life1970年由英国数学家J H Conway所提出includeincludeinclude define ROW 10define COL 25define DEAD 0define ALIVE 1int map[ROW][COL] newmap[ROW][COL] void initint neighbors int intvoid outputMapvoid copyMap int mainint row colchar ansinitwhile 1outputMapfor row 0 row ROW rowfor col 0 col COL colswitch neighbors row colcase 0case 1case 4case 5case 6case 7case 8newmap[row][col] DEADbreakcase 2newmap[row][col] map[row][col] breakcase 3newmap[row][col] ALIVEbreakcopyMapprintf "\nContinue next Generation "getcharans toupper getcharif ans Y breakreturn 0void initint row col for row 0 row ROW rowfor col 0 col COL colmap[row][col] DEAD puts "Game of life Program"puts "Enter x y where x y is living cell"printf "0 x d 0 y d\n"ROW-1 COL-1puts "Terminate with x y -1 -1" while 1scanf "d d" row colif 0 row row ROW0 col col COLmap[row][col] ALIVEelse if row -1 col -1breakelseprintf " x y exceeds map ranage"int neighbors int row int colint count 0 c rfor r row-1 r row1 rfor c col-1 c col1 cif r 0 r ROW c 0 c COL continueif map[r][c] ALIVEcountif map[row][col] ALIVEcount--return countvoid outputMapint row colprintf "\n\n20cGame of life cell status\n" for row 0 row ROW rowprintf "\n20c"for col 0 col COL colif map[row][col] ALIVE putchar else putchar -void copyMapint row colfor row 0 row ROW rowfor col 0 col COL colmap[row][col] newmap[row][col]11Algorithm Gossip 字串核对说明今日的一些高阶程式语言对于字串的处理支援越来越强大例如JavaPerl等不过字串搜寻本身仍是个值得探讨的课题在这边以Boyer- Moore法来说明如何进行字串说明这个方法快且原理简洁易懂解法字串搜寻本身不难使用暴力法也可以求解但如何快速搜寻字串就不简单了传统的字串搜寻是从关键字与字串的开头开始比对例如 Knuth-Morris-Pratt 演算法字串搜寻这个方法也不错不过要花时间在公式计算上Boyer-Moore字串核对改由关键字的后面开始核对字串并制作前进表如果比对不符合则依前进表中的值前进至下一个核对处假设是p好了然后比对字串中p-n1至p的值是否与关键字相同如果关键字中有重复出现的字元则前进值就会有两个以上的值此时则取前进值较小的值如此就不会跳过可能的位置例如texture 这个关键字t的前进值应该取后面的3而不是取前面的7 includeincludeinclude void table char 建立前进表int search int char char 搜寻关键字void substring char char int int 取出子字串int skip[256] int main voidchar str_input[80]char str_key[80]char tmp[80] \0int m n pprintf "请输入字串"gets str_inputprintf ""gets str_keym strlen str_inputn strlen str_keytable str_keyp search n-1 str_input str_key while p -1 substring str_input tmp p mprintf "s\n" tmpp search pn1 str_input str_keyprintf "\n"return 0void table char keyint k nn strlen keyfor k 0 k 255 kskip[k] nfor k 0 k n - 1 kskip[key[k]] n - k - 1int search int p char input char keyint i m nchar tmp[80] \0m strlen inputn strlen key while p msubstring input tmp p-n1 pif strcmp tmp key 比较两字串是否相同return p-n1p skip[input[p]]return -1void substring char text char tmp int s int e int i jfor i s j 0 i e i jmp[j] text[i]tmp[j] \012Algorithm Gossip 双色三色河内塔说明双色河内塔与三色河内塔是由之前所介绍过的河内塔规则衍生而来双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置而三色河内塔则是将下图左上的圆环经移动成为右上的圆环解法无论是双色河内塔或是三色河内塔其解法观念与之前介绍过的河内塔是类似的同样也是使用递回来解不过这次递回解法的目的不同我们先来看只有两个盘的情况这很简单只要将第一柱的黄色移动至第二柱而接下来第一柱的蓝色移动至第三柱再来是四个盘的情况首先必须用递回完成下图左上至右下的移动接下来最底层的就不用管它们了因为它们已经就定位只要再处理第一柱的上面两个盘子就可以了那么六个盘的情况呢一样首先必须用递回完成下图左上至右下的移动接下来最底层的就不用管它们了因为它们已经就定位只要再处理第一柱上面的四个盘子就可以了这又与之前只有四盘的情况相同接下来您就知道该如何进行解题了无论是八个盘十个盘以上等都是用这个观念来解题那么三色河内塔呢一样直接来看九个盘的情况首先必须完成下图的移动结果接下来最底两层的就不用管它们了因为它们已经就定位只要再处理第一柱上面的三个盘子就可以了双色河内塔 C 实作include void hanoi int disks char source char temp char targetif disks 1printf "move disk from c to c\n" source targetprintf "move disk from c to c\n" source target elsehanoi disks-1 source target temphanoi 1 source temp targethanoi disks-1 temp source targetvoid hanoi2colors int diskschar source Achar temp Bchar target Cint ifor i disks 2 i 1 i--hanoi i-1 source temp targetprintf "move disk from c to c\n" source temp printf "move disk from c to c\n" source temp hanoi i-1 target temp sourceprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source targetint mainint nprintf "请输入盘数"scanf "d" n hanoi2colors n return 0C 实作include void hanoi int disks char source char temp char targetif disks 1printf "move disk from c to c\n" source target printf "move disk from c to c\n" source target printf "move disk from c to c\n" source target elsehanoi disks-1 source target temphanoi 1 source temp targethanoi disks-1 temp source targetvoid hanoi3colors int diskschar source Achar temp Bchar target Cint iif disks 3printf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source targetprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp sourceprintf "move disk from c to c\n" target tempelsehanoi disks3-1 source temp targetprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source tempprintf "move disk from c to c\n" source temp hanoi disks3-1 target temp sourceprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp targetprintf "move disk from c to c\n" temp target hanoi disks3-1 source target tempprintf "move disk from c to c\n" target sourceprintf "move disk from c to c\n" target source hanoi disks3-1 temp source targetprintf "move disk from c to c\n" source temp for i disks 3 - 1 i 0 i--if i 1hanoi i-1 target source tempprintf "move disk from c to c\n"target source printf "move disk from c to c\n"target source if i 1hanoi i-1 temp source targetprintf "move disk from c to c\n" source tempint mainint nprintf "请输入盘数"scanf "d" n hanoi3colors nreturn 013Algorithm Gossip 背包问题Knapsack Problem说明假设有一个背包的负重最多可达8公斤而希望在背包中装入负重范围内可得之总价物品假设是水果好了水果的编号单价与重量如下所示0 李子 4KG NT4500 1 苹果 5KG NT57002 橘子 2KG NT22503 草莓 1KG NT1100 4甜瓜 6KG NT6700解法背包问题是关于最佳化的问题要解最佳化问题可以使用「动态规划」Dynamic programming从空集合开始每增加一个元素就先求出该阶段的最佳解直到所有的元素加入至集合中最后得到的就是最佳解以背包问题为例我们使用两个阵列value与itemvalue表示目前的最佳解所得之总价item表示最后一个放至背包的水果假设有负重量 1~8的背包8个并对每个背包求其最佳解逐步将水果放入背包中并求该阶段的最佳解放入李子背包负重 1 2 3 4 5 6 7 8 value 0004500 4500 4500 4500 9000 item ---00000放入苹果背包负重 1 2 3 4 5 6 7 8 value 0004500 5700 5700 5700 9000 item ---0 1 1 1 0放入橘子背包负重 1 2 3 4 5 6 7 8 value 02250 2250 4500 5700 6750 7950 9000 item -2 2 0 1 2 2 0放入草莓背包负重 1 2 3 4 5 6 7 8 value 11002250 3350 4500 5700 6800 7950 9050 item 3 23 0 1 3 2 3放入甜瓜背包负重 1 2 3 4 5 6 7 8 value 11002250 3350 4500 5700 6800 7950 9050 item 3 23 0 1 3 2 3由最后一个表格可以得知在背包负重8公斤时最多可以装入9050元的水果而最后一个装入的水果是3号也就是草莓装入了草莓背包只能再放入7公斤8-1的水果所以必须看背包负重7公斤时的最佳解最后一个放入的是2号也就是橘子现在背包剩下负重量5公斤7-2所以看负重5公斤的最佳解最后放入的是1号也就是苹果此时背包负重量剩下0公斤5-5无法再放入水果所以求出最佳解为放入草莓橘子与苹果而总价为9050元实作 Cincludeinclude define LIMIT 8 重量限制define N 5 物品种类define MIN 1 最小重量 struct bodychar name[20]int sizeint pricetypedef struct body object int main voidint item[LIMIT1] 0int value[LIMIT1] 0int newvalue i s p object a[] "李子" 4 4500 "苹果" 5 5700"橘子" 2 2250"草莓" 1 1100"甜瓜" 6 6700 for i 0 i N i for s a[i]size s LIMIT sp s - a[i]sizenewvalue value[p] a[i]priceif newvalue value[s] 找到阶段最佳解value[s] newvalueitem[s] iprintf "物品\t价格\n"for i LIMIT i MIN i i - a[item[i]]sizeprintf "s\td\n"a[item[i]]name a[item[i]]priceprintf "合计\td\n" value[LIMIT] returnJavaclass Fruitprivate String nameprivate int sizeprivate int price public Fruit String name int size int pricethisname namethissize sizethisprice pricepublic String getNamereturn namepublic int getPricereturn pricepublic int getSizereturn sizepublic class Knapsackpublic static void main String[] argsfinal int 8final int MIN 1int[] item new int[1]int[] value new int[1] Fruit fruits[]new Fruit "李子" 4 4500new Fruit "苹果" 5 5700new Fruit "橘子" 2 2250new Fruit "草莓" 1 1100new Fruit "甜瓜" 6 6700 fo。

趣味c语言编程100例

趣味c语言编程100例

趣味c语言编程100例趣味 c 语言编程100 例【程序 1】题目:有1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、 2、3、4。

组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++) / *以下为三重循环 */for( j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /* 确保 i 、 j、 k 三位互不相同 */printf("%d,%d,%d\n",i,j,k);}}程序 2】题目:企业发放的奖金根据利润提成。

利润 (I) 低于或等于 10 万元时,奖金可提 10% ;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可可提成 7.5% ; 20 万到 40 万之间时,高于 20 万元的部分,可提成 5% ; 40 万到 60 万之间时高于40 万元的部分,可提成 3% ;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5% ,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1. 程序分析:请利用数轴来分界,定位。

注意定义时需把奖金定义成长整型。

2. 程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;。

c语言经典算法——猴子偷桃问题

c语言经典算法——猴子偷桃问题

c语⾔经典算法——猴⼦偷桃问题题⽬:海滩上有⼀堆桃⼦,五只猴⼦来分。

第⼀只猴⼦把这堆桃⼦凭据分为五份,多了⼀个,这只猴⼦把多的⼀个扔⼊海中,拿⾛了⼀份。

第⼆只猴⼦把剩下的桃⼦⼜平均分成五份,⼜多了⼀个,它同样把多的⼀个扔⼊海中,拿⾛了⼀份,第三、第四、第五只猴⼦都是这样做的,问海滩上原来最少有多少个桃⼦?算法分析://初始桃⼦数为sum第⼀次:sum=5*x1+1第⼆次:4*x1=5*x2+1第三次:4*x2=5*x3+1第四次:4*x3=5*x4+1第五次:4*x4=5*x5+1第五次分配结束:剩下4*x5个桃⼦,⽽x5>=1,故i=4*x5>=4 。

每次向上推j=(i/4)*5+1;i=j;每次上推结束后判断j%4是否等于0,如果为0则继续上推,否则更新i,直到找到能够完成五次上推的整数i,最后可以得到最初的桃⼦数。

C语⾔程序:1 #include<stdio.h>2int main(int agrc, char*agrv[])3 {4int i, m, j, k, count;5for (i = 4; i<10000; i += 4)6/*i为5个猴⼦分配桃⼦后最后剩余的桃⼦,必须为4的倍数,然后以此为基础,7向上推5次,如果刚好能够推到第五次,则此剩余的桃⼦数i是满⾜条件的,否则换⼀个8剩余的桃⼦数,直到找到符合条件的最⼩剩余桃⼦数*/9 {10 count = 0;11 m = i;12for (k = 0; k<5; k++)13 {14 j = i / 4 * 5 + 1;15 i = j;16if (j % 4 == 0)17 count++;18else19break;20 }21 i = m;22if (count == 4)23 {24 printf("原来最少的桃⼦数为:%d\n", j);25break;26 }27 }28 system("pause");29return0;30 }。

C-C++趣味程序百例

C-C++趣味程序百例

C/c++趣味程序百例(献给C/C++初学者)(三)41.马克思手稿中的数学题马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?*问题分析与算法设计设x,y,z分别代表男人、女人和小孩。

按题目的要求,可得到下面的方程:x+y+z=30 (1)3x+2y+z=50 (2)用方程程序求此不定方程的非负整数解,可先通过(2)-(1)式得:2x+y=20 (3)由(3)式可知,x变化范围是0~10*程序说明与注释#include<stdio.h>int main(){int x,y,z,count=0;printf(" Men Women Children\n");printf("........................................\n");for(x=0;x<=10;x++){y=20-2*x; /*x定值据(3)式求y*/z=30-x-y; /*由(1)式求z*/if(3*x+2*y+z==50) /*当前得到的一组解是否满足式(2)*/printf(" %2d: %d %d %d\n",++count,x,y,z);}}42.最大公约数和最小公倍数求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)*问题分析与算法设计手工方式求两个正整数的蝚大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。

*程序说明与注释#include<stdio.h>int main()int a,b,num1,num2,temp;printf("Input a & b:");scanf("%d%d",&num1,&num2);if(num1>num2) /*找出两个数中的较大值*/{temp=num1; num1=num2; num2=temp; /*交换两个整数*/}a=num1; b=num2;while(b!=0) /*采用辗转相除法求最大公约数*/{temp=a%b;a=b;b=temp;}printf("The GCD of %d and %d is: %d\n",num1,num2,a); /*输出最大公约数*/printf("The LCM of them is: %d\n",num1*num2/a); /*输出最小公倍数*/ }*运行结果1.Input a & b: 20 55The GCD of 20 and 55 is: 5The LCM of them is: 2202.Input a & b: 17 71The GCD of 17 and 71 is: 1The LCM of them is: 12073.Input a & b: 24 88The GCD of 24 and 88 is: 8The LCM of them is: 2644.Input a & b: 35 85The GCD of 35 and 85 is: 5The LCM of them is: 595*思考题求一个最小的正整数,这个正整数被任意n(2<=n<=10)除都是除不尽的,而且余数总是(n-1)。

C语言超经典算法大全

C语言超经典算法大全

C语言经典算法大全老掉牙河内塔费式数列巴斯卡三角形三色棋老鼠走迷官(一)老鼠走迷官(二)骑士走棋盘八个皇后八枚银币生命游戏字串核对双色、三色河内塔背包问题(Knapsack Problem)数、运算蒙地卡罗法求 PIEratosthenes筛选求质数超长整数运算(大数运算)长 PI最大公因数、最小公倍数、因式分解完美数阿姆斯壮数最大访客数中序式转后序式(前序式)后序式的运算关于赌博洗扑克牌(乱数排列)Craps赌博游戏约瑟夫问题(Josephus Problem)集合问题排列组合格雷码(Gray Code)产生可能的集合m元素集合的n个元素子集数字拆解排序得分排行选择、插入、气泡排序Shell 排序法 - 改良的插入排序Shaker 排序法 - 改良的气泡排序Heap 排序法 - 改良的选择排序快速排序法(一)快速排序法(二)快速排序法(三)合并排序法基数排序法搜寻循序搜寻法(使用卫兵)二分搜寻法(搜寻原则的代表)插补搜寻法费氏搜寻法矩阵稀疏矩阵多维矩阵转一维矩阵上三角、下三角、对称矩阵奇数魔方阵4N 魔方阵2(2N+1) 魔方阵1.河内之塔说明河内之塔(Towers of Hanoi)是法国人(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。

解法如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。

如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。

有趣的c语言代码例子

有趣的c语言代码例子

有趣的c语言代码例子以下是一些有趣的C语言代码示例:1. Hello World 。

这是经典的第一步,向世界打招呼。

```C。

#include <stdio.h>。

int main() 。

printf("Hello, World!");。

return 0;。

}。

```。

2.猜数字游戏。

让玩家猜一个随机数字,直到猜对为止。

```C。

#include <stdio.h>。

#include <stdlib.h>。

#include <time.h>。

int main() 。

int num, guess, tries = 0;。

srand(time(0)); //随机数种子。

num = rand() % 100 + 1; //生成1-100之间的随机数。

do 。

printf("Enter a guess between 1 and 100: ");。

scanf("%d", &guess);。

tries++;。

if (guess > num) 。

printf("Too high! Try again.\n\n");。

} else if (guess < num) 。

printf("Too low! Try again.\n\n");。

} else 。

printf("\nCongratulations! You guessed the number in %d attempts.\n", tries);。

}。

} while (guess != num);。

return 0;。

}。

```。

3.逆转字符串。

将输入的字符串逆转。

```C。

#include <stdio.h>。

#include <string.h>。

c语言有趣的代码

c语言有趣的代码

c语言有趣的代码有趣的C语言代码C语言是一门广泛应用于计算机科学领域的编程语言,它的语法简单易懂,功能强大,可以用来编写各种各样的程序。

在C语言中,有一些有趣的代码,它们不仅可以让我们更好地理解C语言的特性,还可以让我们在编程中更加有趣。

下面,我将介绍一些有趣的C语言代码。

1. Hello WorldHello World是C语言中最简单的程序,它可以输出一句话“Hello World”。

这个程序的代码非常简单,只需要一行:```c#include <stdio.h>int main() {printf("Hello World\n");return 0;}```这个程序的输出结果是:```Hello World```2. Fibonacci数列Fibonacci数列是一个非常有趣的数列,它的每个数都是前两个数的和。

在C语言中,我们可以用递归函数来实现Fibonacci数列的计算。

下面是一个计算Fibonacci数列的程序:```c#include <stdio.h>int fibonacci(int n) {if (n == 0 || n == 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}int main() {int n = 10;for (int i = 0; i < n; i++) {printf("%d ", fibonacci(i));}printf("\n");return 0;}```这个程序的输出结果是:```0 1 1 2 3 5 8 13 21 34```3. 猜数字游戏猜数字游戏是一种非常有趣的游戏,它可以让我们在编程中体验到游戏的乐趣。

在C语言中,我们可以用随机数生成函数来实现猜数字游戏。

下面是一个简单的猜数字游戏程序:```c#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {srand(time(NULL));int number = rand() % 100 + 1;int guess;do {printf("Guess a number between 1 and 100: "); scanf("%d", &guess);if (guess > number) {printf("Too high!\n");} else if (guess < number) {printf("Too low!\n");} else {printf("You win!\n");}} while (guess != number);return 0;}```这个程序的输出结果是:```Guess a number between 1 and 100: 50Too high!Guess a number between 1 and 100: 25Too low!Guess a number between 1 and 100: 37Too high!Guess a number between 1 and 100: 31Too high!Guess a number between 1 and 100: 28You win!```总结以上是三个有趣的C语言代码,它们分别是Hello World、Fibonacci数列和猜数字游戏。

c语言趣味题目

c语言趣味题目

14 c语言趣味题目
以下是一些C语言的趣味题目:
1.绘制余弦曲线:要求使用C语言绘制余弦曲线,并可以设定曲线的幅度和周期。

2.绘制余弦曲线和直线:在同一个坐标系中绘制余弦曲线和直线,观察它们的交点。

3.绘制圆:使用C语言绘制一个圆,并可以设定圆的半径和中心点坐标。

4.绘制螺旋线:要求使用C语言绘制螺旋线,并可以设定螺旋线的半径和旋转角度。

5.猜数字游戏:要求使用C语言编写一个猜数字游戏,随机生成一个1到100之间的
数字,然后让用户猜这个数字。

6.计算阶乘:要求使用C语言计算一个正整数的阶乘,并可以输出结果。

7.判断质数:要求使用C语言判断一个正整数是否为质数,并可以输出结果。

8.寻找最大值:要求使用C语言编写一个程序,寻找一组数中的最大值。

9.字符串反转:要求使用C语言编写一个程序,将一个字符串反转并输出结果。

10.数字排序:要求使用C语言编写一个程序,对一组数字进行排序。

c语言很有趣的求六位数的题

c语言很有趣的求六位数的题

c语言很有趣的求六位数的题以下是一个有趣的C语言题目,涉及到六位数的计算:题目描述:给定一个六位数,请编写一个C程序,计算这个六位数从左到右和从右到左读都是一样的数字有多少个。

例如,给定数字123456,从左到右和从右到左读都是一样的数字有11, 22, 33, 44, 55, 66, 121, 232, 343, 454, 565, 676, 12321, 23432, 34543, 45654, 56765, 67876, 1234321 共18 个。

解题思路:这个题目的关键是如何判断一个数字从左到右和从右到左读都是一样的。

可以通过将数字转换为字符串,然后比较字符串和其反转字符串是否相等来实现。

具体实现步骤如下:1. 将给定的六位数转换为字符串。

2. 从字符串中取出前三个字符和后三个字符,分别转换为数字。

3. 判断这两个数字是否相等,如果相等则说明这个六位数从左到右和从右到左读都是一样的。

4. 遍历所有六位数,统计符合条件的数字的个数。

以下是一个实现该算法的C程序:c复制代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int is_palindrome(int num) {char str[7]; // 存储六位数的字符串sprintf(str, "%06d", num); // 将数字转换为字符串char rev_str[7]; // 存储反转后的字符串strcpy(rev_str, str); // 将原字符串复制到反转字符串中strrev(rev_str); // 反转字符串return strcmp(str, rev_str) == 0; // 比较原字符串和反转字符串是否相等}int main() {int count = 0; // 统计符合条件的数字的个数for (int i = 100000; i <= 999999; i++) { // 遍历所有六位数if (is_palindrome(i)) { // 判断这个六位数是否符合条件count++; // 统计符合条件的数字的个数}}printf("符合条件的六位数共有%d 个\n", count); // 输出结果return 0;}。

Cc++趣味程序百例(献给CC++初学者)

Cc++趣味程序百例(献给CC++初学者)

C/c++趣味程序百例(獻給C/C++初學者)1.繪製餘弦曲線2.繪製餘弦曲線和直線3.繪製圓4.歌星大獎賽5.求最大數6.高次方數的尾數7.階乘尾數零的個數8.借書方案知多少9.楊輝三角形10.數制轉換11.打魚還是曬網12.抓交通肇事犯13.該存多少錢14.怎樣存錢利最大15.捕魚和分魚16.出售金魚17.平分七筐魚18.有限5位數19.8除不盡的自然數20.一個奇異的三位數21.4位反序數22.求車速23.由兩個平方三位數獲得三個平方二位數24.阿姆斯特朗數25.完全數26.親密數27.自守數28.回文數29.求具有abcd=(ab+cd)2性質的四位數30.求素數31.歌德巴赫猜想32.可逆素數33.回文素數34.要發就發35.素數幻方36.百錢百雞問題37.愛因斯坦的數學題38.換分幣39.年齡幾何40.三色球問題41.馬克思手稿中的數學題42.最大公約數和最小公倍數43.分數比較44.分數之和45.將真分數分解為埃及分數46.列出真分數序列47.計算分數的精確值48.新娘和新郎49.委派任務50.誰在說謊51.誰是竊賊52.黑與白53.迷語博士的難題(1)54.迷語博士的難題(2)55.哪個大夫哪天值班56.區分旅客國籍57.誰家孩子跑最慢58.拉丁方陣59.填表格60.1~9分成1:2:3的三個3位數61.1~9組成三個3位的平方數62.由8個整數形成奇特的立方體63.減式還原64.乘式還原65.乘式還原(2)66.除式還原(1)67.除式還原(2)68.九位累進可除數69.魔術師的猜牌術(1)70.魔術師的猜牌術(2)71.約瑟夫問題72.郵票組合73.和數能表示1~23的5個正整數74.可稱1~40磅的4塊砝碼75.10個小孩分糖果76.小明買書77.波松瓦酒的分酒趣題78.求π的近似值79.求π的近似值(2)80.奇數平方的一個有趣性質81.角谷猜想82.四方定理83.卡布列克常數84.尼科徹斯定理85.回文數的形成86.自動發牌87.黑白子交換88.常勝將軍89.搶3090.搬山遊戲91.人機猜數遊戲92.人機猜數遊戲(2)93.漢諾塔94.兔子產子95.將阿拉伯數字轉換為羅馬數字96.選美比賽97.滿足特異條件的數列98.八皇后問題99.超長正整數的加法100.數字移動1.繪製餘弦曲線在屏幕上用「*」顯示0~360度的餘弦函數cos(x)曲線*問題分析與算法設計如果在程序中使用數組,這個問題十分簡單。

妙趣横生的算法(C语言实现)

妙趣横生的算法(C语言实现)
第19行改为
if(str[i-1] == '0'&& i!=0)/*如果是字符串的0-1转换点*/
即多加一个条件i!=0,这样程序更加严谨。
17、第363页,例10-44的分析中,第二行“下面给出每一步操作(Push,Pop)后堆栈、入栈队列和出栈队列的状态,如图10-40所示。”改为如图10-43所示。
18、P375图10-56错了,与图10-53印成一样的了,应该是
图10-56程序10-34的运行结果
LinkList r;
if(q==list){/*改为iext;
free(q);
}
else{
for(r=*list;r->next!=q;r=r->next); /*遍历链表,找到q的前驱结点的指针*/
if(r->next!=NULL){
r->next=q->next;
9、第119页,寻找矩阵鞍点的算法描述,改为下面的描述更为清楚。
按行寻找矩阵鞍点的算法描述:
对于一个m*n的矩阵
i0;
Repeat:
找出第i行中最大的元素A[i][t];
If(本行中有与元素A[i][t]的值相等的元素)
Then本行中没有鞍点,执行ii+1,并跳出本次Repeat循环;
Else将元素A[i][t]与第t列中的每个元素逐一进行比较,
也就是将第4行的10~999改为1~999。
12、第165页,图5-33印刷不清楚,见下图。
13、第241页,本页的算法中变量flag写的有问题,应该改为如下:
int JusticCompleteBiTree(BiTree T,int level ,int n,int *flag){

算法实现_C语言趣味实验_[共2页]

算法实现_C语言趣味实验_[共2页]

142
2.最大公约数和最小公倍数
辗转相除法,又名欧几里德算法(Euclidean algorithm),是求两个正整数的最大公约数的算法。

它是已知最古老的算法,可追溯至3 000年前。

(1)执行过程
① 对于已知两自然数m,n,假设m>n。

② 计算m除以n,将得到的余数记为r。

③ 如果r=0,则n为求得的最大公约数,否则执行下面一步。

④ 将n值保存到m中,将r值保存到n中,重复执行步骤 与 ,直到r=0,便得到最大公约数。

(2)算法流程图
算法流程图如图6-2所示。

图6-1 判断一个数是否为素数图6-2 求两数的最大公约数
6.5 算法实现
1.计算素数算法应用
# include <stdio.h>
int isPrime(int n)
{ int i;
for(i=2;i<n;i++)
{ if(n%i==0)
return 0;
}
return 1;
}
void main()
{ int i,n,count;
n = 1000;
count = 0;
printf("列举1-1000之间的所有素数:\n");
for(i=1;i<1000;i++)
{ if(isPrime(i)==1)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("*");
/*圆的左侧*/
for( ; x < 30+m; x ++ )
printf(" ");
/*图形的空心部分控制*/
printf("*\n");
/*圆的右侧*/
}
return 0;
if( x == m && x == n)
printf("+");
/*直线与cos(x)相交时打印“+”*/
else if( x == n )
}
return 0;
}
NO.2 输出sin()曲线
#include<stdio.h>
#include<math.h>
int main()
{
double y;
int x,m,n,yy;
for(yy=0;yy<=20;yy++) /*对于第一个y坐标进行计算并在一行中打印图形*/
NO.1 输出cos()曲线
#include<stdio.h>
#include<math.h>
int main()
{
double y;
int x,m;
for( y = 1; y >= -1; y -= 0.1 ) /*y为列方向,值从1到-1,步长为0.1*/
}
NO.4 歌星大奖赛

{
m = acos(y) * 10;
/*计算出y对应的弧度m,乘以10为图形放大倍数*/
for( x=1; x<m; x++ )
printf(" ");
printf("*");
printf("+");
/*打印不相交时的直线图形*/
else if( x == m || x == 62-m )
Байду номын сангаас /*其它情况打印空格*/
printf("\n");
}
return 0;
}
NO.3 绘制圆
在屏幕上用“*”画一个空心的圆*问题分析与算法设计:打印圆可利用图形的左右对称性。
n = 45 * (y-1) + 31;
/*n: 直线上y点对应的列坐标*/
for( x=0; x<=62; x++ )
/*x: 屏幕列方向坐标*/
{
y=0.1 * yy;
/*y:屏幕行方向坐标*/
m = acos(1-y)*10;
/*m: cos(x)曲线上y点对应的屏幕列坐标*/
根据圆的方程:R*R=X*X+Y*Y 可以算出圆上每一点行和列的对应关系。
#include<stdio.h>
#include<math.h>
int main()
{
double y;
int x,m;
for( y = 10; y >= -10; y -- )
/*控制打印左侧的* 号*/
for( ; x<62-m; x++ )
printf(" ");
printf("*\n");
/*控制打印同一行中对称的右侧*号*/
printf("*");
/*打印不相交时的cos(x)图形*/
else printf(" ");
{
m=2.5*sqrt(100-y*y);
/*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的行距大于列距,不进行调节显示出来的将是椭圆*/
for( x = 1; x < 30-m; x ++ )
printf(" ");
/*图形左侧空白控制*/
相关文档
最新文档