信息学竞赛典型例题程序汇集
- 格式:doc
- 大小:666.94 KB
- 文档页数:53
信息学奥林匹克竞赛试题题型归类与总结数学类问题精度处理(高精度、实数处理、COMP、EXTENDED、REAL类型处理方法)组合数学问题(Fibonacci数列、第二类数、卡特兰数、POL YA原理、排列组合计数、加法原理与乘法原理)进制问题(特定二进制串的统计、二分查找、利用二进制进行路径、状态描述、二进制转换)递推与递归关系(递推关系式、通项公式、数列、博弈问题)数位、数字、特定数值的查找、统计(数值处理、质因子分解、幂次分解、数值表达式、添加运算符、分式与实数运算)数学杂题(回文数字、矩阵处理、约瑟夫与反约瑟夫问题)数学剪枝(无解判定、解线性方程组、限定搜索范围)✓相关公式、定理、原理的应用✓寻找规律、归纳整理递归与递推关系式✓按照数学方法构造、二进制转化等技巧性处理✓注意事项:●规律准确(小数据手工推算、搜索程序验证)●数据类型是否合理、数据范围是否超界(大数据处理)字符、字串处理类问题读入、分离和统计问题(文件结束符、行结束符、空格符、回车符、字符组合分离、统计)插入、删除、修改、替换等相关编辑问题(字符距离、优美编辑、初始状态与目标状态的变换、迭代等处理性问题)KMP算法及其改正回文串、高精度运算及其以字符(串)作为处理对象的相关问题✓一般性字符处理✓动态规划方法✓字符树(查找、树的前序、中序、后序遍历)✓注意事项:●读入时小心(READ、READLN语句及结束标记)●字符串类型与字符数组存贮及其压缩存取统计类问题方案总数统计(矩阵、三角形划分方案统计、问题解集个数统计)特定、离散元素统计(机场跑道、01统计、天外来客等二进制统计问题)横向、纵向规模化问题(数据范围、数据维数巨大)离散化问题(卫星覆盖、图形周长)一般性统计问题(时间复杂度(自创试题))✓扫描技术、归类统计及平面、空间坐标体系变换等几何学知识✓离散化思想✓线段树处理方法✓降维、剪枝✓借助于数学方法进行统计✓注意事项:●统计计数:避免待统计元素的遗漏、重复●多次读文件、边读边处理等大数据文件的处理技巧模拟类问题按题设描述进行直接模拟(内存分配、粒子运动、方块下落(HNOI97试题)) 队列模型模拟(银行事件驱动、公交车站、牙医诊所)按时间(刻)顺序模拟状态(商船运输)类Pascal语言程序(算法)运行模拟✓按条件描述直接模拟✓注意事件发生的起止时间、状态的变化✓按某一指标(时间)排序进行预处理✓注意事项:●准确理解题意,切忌加入个人想当然思想,严格按题意进行模拟●一般来说要考虑的因素较多,容易让人思路糊涂,做题前要有绝对清晰的思路并逐步修正要考虑的各种因素搜索类问题枚举类问题(NOI94 字符排列、98 围巾裁剪、COI95 五骰子、IOI94时钟问题、IOI95铺放矩阵块、IOI98 圆桌骑士等有较好枚举方法或枚举量不大的问题) 产生式系统(产生式规则,生成新的元素类问题,COI95 P集合,NOI97文件匹配、NOI98软件安装盘、COI98站牌设置、NOI00 算符破译、COI97平分资源、COI99数字游戏、IOI94 汔车问题及其引发的相关问题(论文))无任何好的解决办法或其他方法不能完成的问题(NOI99 生日蛋糕)搜索与其他方法的结合(与动态规划的结合、与贪心思想的结合等)✓确定搜索对象和搜索策略✓选取适合的搜索方法(深度、广度、记忆化搜索)✓注意与其他方法的结合(贪心回朔、动态规划)✓减少搜索量(剪枝)✓注意事项:●剪枝条件的正确性(加剪枝条件与不加剪条件的程序结果对照)●搜索也是解决问题的一种方法,有时搜索程序也可以收到较好的效果,只要有较好的优化措施最优化问题图论中的最优化问题规划问题特定指标(长度、次数等)最(极)值问题✓动态规划✓图论中经典算法及其改正✓贪心+搜索解决办法✓贪心思想✓数学方法✓注意事项:●动态规划阶段划分、状态描述及转移方程对动态规划效率的影响(迷宫改造、博士研究、花店橱窗)●状态存贮对空间优化的影响(根据题目特点决定状态存贮数目(HNOI2002目录结构)、状态存贮方法的选取(滚动存贮、压缩存贮))●双层动态规划●多次动态规划图论问题最小生成树问题、最小点基、中心点设置路径问题(最短路、关键路径、道路、回路(ERLUR回路、哈密顿回路))拓扑排序问题(顶点的度)连通性问题(添加、删除边、点增加或减少连通度)流量问题二部图的匹配问题(最大匹配、最佳匹配)✓点、边、权、度等图中基本元素关系(骆驼商队问题)✓拓朴排序作预处理✓图论算法的变形与改正✓图搜索算法✓标号法✓动态规划方法✓注意事项:●选取图结构的存贮数据结构(矩阵、邻接表)●在构建图模型时,考虑是否有多种构图方法基础算法类问题迭代方法解决的问题分治方法解决的问题归纳类问题枚举问题模拟问题。
信息学奥赛题目
信息学奥赛的题目通常都是比较具有挑战性的编程题目,旨在考察参赛者的编程能力、算法设计和创新能力。
以下是一些信息学奥赛的题目示例:
1. 数字三角形(Digital Triangle)
给定一个包含正整数n(n≥2)行数字的三角形,每行的数字个数等于n-1,从左到右递增排列。
第一行只有1个数字1,第二行有2个数字1和2,第三行有3个数字1、2和3,以此类推。
编写一个程序,根据给定的三角形,输出这个数字三角形的图形。
2. 单词接龙(Word Chain)
给定一个单词列表,每个单词的最后一个字母是下一个单词的第一个字母。
编写一个程序,输入一个单词,输出这个单词在这个接龙中的位置,以及这个接龙中所有单词的列表。
3. 最长回文子串(Longest Palindromic Substring)
给定一个字符串,编写一个程序,找到这个字符串中最长的回文子串。
回文子串是指正读和反读都相同的子串。
4. 最大子段和(Maximum Subarray Sum)
给定一个整数数组,编写一个程序,找到这个数组中的一个连续子段,使得这个子段的和最大。
5. 最近点对(Closest Pair of Points)
给定一个二维平面的点集,编写一个程序,找到这个点集中距离最近的两个点。
这些题目只是信息学奥赛题目的冰山一角,实际比赛中的题目可能更加复杂和具有挑战性。
参赛者需要具备扎实的编程基础、算法设计和创新能力,才能在比赛中取得好成绩。
全国青少年信息学奥林匹克联赛培训习题与解答(中学高级本)光盘模拟试题集普及组 (2)第一套 (2)打保龄球 (2)安全逃离 (2)表达式的转换 (3)到天宫做客 (4)第二套 (5)奶牛卧室 (5)进制转换 (5)硬币翻转 (5)拱猪计分 (6)第三套 (7)车厢重组 (7)阶乘问题 (8)子数整数 (8)垃圾陷阱 (9)提高组 (10)第一套 (10)低价购买 (10)棋盘游戏 (10)求正整数 (11)奇怪的电梯ok (11)第二套 (12)轰炸 (12)连续自然数和ok (12)约瑟夫 (13)点和线 (13)第三套 (14)杂务 (14)排行榜 (14)银行贷款 (15)机器人搬重物 (16)第四套 (17)数字组合 (17)相似基因 (17)波浪数 (18)文件压缩 (19)省队训练 (20)第一套 (20)海战ok (20)POLYGON (20)POWER (21)婚礼 (21)第二套 (22)多边形的面积 (22)玛丽卡 (23)PASTE (24)SEARCH (24)第三套 (25)文件排版 (25)纵横填字游戏 (26)普通递归关系 (27)完美的对称 (28)普及组第一套打保龄球源程序名bowling.??? (pas,c,cpp)可执行文件名 bowling.exe输入文件名 bowling.in输出文件名 bowling.out打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。
一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。
一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。
即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。
具体的滚球击柱规则和计分方法如下:(1)若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。
信息奥赛题目
1、求N!的值
【问题描述】
用高精度方法,求N!的精确值(N以一般整数输入)。
【输入样例】ni.in 【输出样例】ni.out
10 3628800
2、阶乘和(sum.pas)
【问题描述】
已知正整数N(N<=100),设S=1!+2!+3!+...N!。
其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。
请编程实现:输入正整数N,输出计算结果S的值。
【输入样例】sum.in 【输出样例】sum.out
4 33
3、回文数
【问题描述】
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如,对于10进制数87,STEPl:87+78= 165 STEP2:165+561= 726 STEP3:726+627=1353 STEP4:1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<N<=10或N=16)进制数M.求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
【输入样例】:9 87
【输出样例】:6。
信息学奥赛经典算法C语言经典例题100例经典C源程序100例1.【程序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.【程序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;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus); }==============================================================3.【程序3】完全平方数题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
信息学竞赛题目
当提到信息学竞赛时,通常指的是计算机和算法相关的竞赛,如国际信息学奥林匹克竞赛(IOI)等。
以下是一些可能的信息学竞赛题目,包括算法设计、编程、数据结构等方面的内容:
最短路径问题:
设计一个算法,找到加权图中两点之间的最短路径。
可以考虑使用Dijkstra 算法或Floyd-Warshall算法。
排序算法的比较:
实现不同排序算法(如快速排序、归并排序、冒泡排序等),并比较它们在不同数据集上的性能。
动态规划问题:
解决一个动态规划问题,例如背包问题、最长公共子序列等。
图论问题:
给定一个图,设计算法检测是否存在环路,或者找到图中的最小生成树。
字符串处理:
编写一个程序,实现字符串的模式匹配或编辑距离计算。
并查集应用:
使用并查集解决一个集合合并或划分问题,例如朋友圈问题。
图的遍历:
设计一个算法,对图进行深度优先搜索(DFS)或广度优先搜索(BFS)。
动态规划背包问题:
给定一组物品的重量和价值,设计一个动态规划算法解决背包问题,最大化所装物品的总价值。
树的遍历与操作:
对一棵树进行先序、中序或后序遍历,并进行相应的操作,例如计算树的高度、直径等。
最大流问题:
设计一个算法解决最大流问题,例如Ford-Fulkerson算法或Edmonds-Karp 算法。
这些题目涉及了算法设计、数据结构、图论等多个方面,是信息学竞赛中常见的类型。
挑战性强,需要竞赛者具备深厚的计算机科学知识和解决问题的能力。
希望这些题目能够激发你在信息学竞赛中的学习兴趣。
信息学竞赛试题题一:编程题给定一个字符串s,求字符串中最长连续重复子串的长度。
输入格式:一行一个字符串s,只包含小写字母,长度不超过100000。
输出格式:一个整数,表示最长连续重复子串的长度。
示例输入:abbbbbccccc示例输出:5题目解析及思路:对于该问题,我们可以使用双指针的方法进行求解。
定义两个指针start和end,start指向当前连续重复子串的起始位置,end指向当前子串的末尾位置,初始化时start和end都指向字符串s的第一个字符。
然后我们不断向右移动end指针,直到当前连续重复子串中出现一个不同的字符,此时我们就找到了一个连续重复子串。
然后我们更新当前子串的长度,并将start指针指向end指针的下一个位置,继续向右移动end指针,直到遍历完整个字符串。
具体实现细节如下:#include <iostream>#include <string>using namespace std;int main() {string s;getline(cin, s);int n = s.length();int start = 0, end = 0, ans = 0; // 初始化start和end指针,并设ans 为0while (end < n) { // 当end指针未到达字符串末尾时while (end < n && s[end] == s[start]) { // 移动end指针,直到出现不同的字符end++;}ans = max(ans, end - start); // 更新ans为当前子串的长度start = end; // 更新start指针为end指针的下一个位置}cout << ans << endl; // 输出最长连续重复子串的长度return 0;}时间复杂度分析:在上述算法中,我们对字符串进行了一次线性扫描,每次在内部循环中对end指针进行了O(1)次移动,因此总的时间复杂度为O(n),其中n为字符串的长度。
高中信息学竞赛各种问题求解试题及答案高中信息学竞赛各种问题求解试题及答案第1题(5分),将n个不同颜色的球放人k个无标号的盒子中( n>=k,且盒子不允许为空)的方案数为S(n,k),例如:n=4,k=3时,S(n,k)=6。
当n=6,k=3时,S(n,k)=________。
答案:0 k < nS(n,k)= 1 k = 1S(n-1,k-1)+k*S(n-1,k) n >= k >= 2第2题(5分),有5本不同的数学书分给5个男同学,有4本不同的英语书分给4个女同学,将全部书收回来后再从新发给他们,与原方案都不相同的方案有________种。
答案:5!*4!+D(5)*D(4)=1140480其中:D(n)=(n-1)*(D(n-1)+D(n-2)) (n > 2)D(1)=0 D(2)=1第3题(6分),把三角形各边分成n等分,过每一分点分别做各边的平行线,得到一些由三角形的边和这些平行线所组成的平行四边形。
n为已知整数,能组成_______个平行四边形。
答案:3*C(n+2,4)第4题(6分),由a,b,c3个不同的数字组成一个N位数,要求不出现两个a相邻,也不出现两个b相邻,这样的N位数的个数为AN,用AN-1和AN-2表示AN 的关系式为:AN=_______________。
答案:AN= 2*AN-1+AN-2第5题(6分),在m*n的棋盘上,每个方格(单位正方形,即边长为1的正方形)的顶点称为格点。
以格点为顶点的多边形称为格点多边形。
若设格点凸N边形面积的最小值为gn,格点凸N边形内部(非顶点的)格点的个数的最小值为fn,则gn和fn的关系式为:gn=___________。
答案:Gn= fn+N/2-1 ( N >= 3 )第6题(4分),编号为1到13的纸牌顺时针排成一圈,有人从编号为1的牌从数字1开始顺时针数下去,1、2、3、…、20、21、…,一圈又一圈。
程序设计试题及答案(备注:试题难度评价采取五★级评价体系,分基础、容易、一般、稍难、难五个等级,其中的一、二、三★级都属于程序设计的基础试题级别,同学们稍加思考均有能力求得正确解答,对于四★级试题属于程序设计试题基础级别的思考题,五★级难度试题在此没有涉及,在程序设计高级试题中另行讲解。
对于基础和容易两个级别的程序设计试题,若能够给出语句分类(如If条件语句、条件语句嵌套、循环语句、多重循环语句等)的将尽量给出。
若属于13大类别的将尽量标注。
)程序设计试题几大分类:1、1\素数类问题(求素数的几种算法):2、数据排序问题(数据排序的几种方法):3、最大公约数和最小公倍数问题(几种算法):4、公式求解类问题(如求圆周率π、自然常数e、解方程等等):5、编号相反处理问题:6、约瑟夫问题(或猴子选大王问题、密码问题):7、回文数问题:8、高精度数值计算问题:9、数值计算问题:10、进制相互转换问题:11、字符串倒置问题:12、排列与组合类问题:13、因子、质因子(质因数)类相关问题:答案部分:(程序设计的源程序没有统一的标准答案,实现程序的算法也是多种多样,但结果是唯一的,算法也有优劣之分,一个程序的优劣,关键在于是否找到了好的算法,以下程序和算法不一定就是最佳算法和最佳程序,只能仅供参考,希望同学们能够对某些程序提出更好的算法来改进程序)(经常碰到的判断是否为素数、是否为回文数、求两个数的最大公约数、求两个数的最小公倍数等问题的子函数源程序,请务必记住!)①判断是否为素数,若是素数则返回true,若不是素数则返回false:function prime(x:longint):boolean;varj,y:longint;beginprime:=true;if x<2 then prime:=false;y:=trunc(sqrt(x));for j:=2 to y doif (x mod j = 0) thenbegin prime:=false; exit; end;end;备注:1~100之间所有的素数:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97。
全国青少年信息学奥林匹克竞赛题目
全国青少年信息学奥林匹克竞赛题目
第一题:计算机编程
编写一个程序,接受用户输入的一个正整数n,并输出从1到n之间所有奇数的平方和。
示例输入:
7
示例输出:
奇数的平方和为: 1+9+25+49 = 84
第二题:算法设计
给定一个由n个整数组成的数组a,设计一个算法找到其中第k大的数。
要求:
- 保证数组a中的元素互不相同;
- 数组a中的元素个数n和待查找的第k大的数保证合法范围。
示例输入:
n = 7, k = 3
a = [5, 9, 2, 7, 4, 1, 8]
示例输出:
第3大的数是: 7
第三题:数据结构
设计一个数据结构,实现以下两种功能:
- 将一个整数x插入到数据结构中;
- 寻找数据结构中第k小的数。
要求:
- 数据结构的插入和查找操作的时间复杂度均为O(log n),其中n 为数据结构中元素的个数。
示例输入:
插入数据:7, 5, 9, 2, 4
第3小的数
示例输出:
第3小的数为: 5
第四题:网络安全
近期,某公司的网络系统遭受了黑客攻击,你被聘请为该公司的网络安全顾问。
请你设计一种能够检测并阻止恶意攻击的算法。
要求:
- 算法能够实时监测网络流量,并分析流量中的威胁;
- 算法能够根据威胁等级,自动阻止恶意攻击。
示例输入:
网络流量数据包
示例输出:
阻止恶意攻击
以上是全国青少年信息学奥林匹克竞赛的一些题目,希望参赛选手能够通过这些题目展示自己在编程、算法设计、数据结构和网络安全等方面的才能和技能。
信息学竞赛复习1.斐波拉契数列(1000000以内的数字)#include “stdio.h”#include “stdlib.h”void main(){long fib1=1,fib2=1,fib=0;printf("1000000以内的数字:\n\n");printf("%d\n%d\n",fib1,fib2);while (fib<1000000){fib=fib1+fib2;fib1=fib2;fib2=fib;printf( "%d \n", fib);}system("pause");}2.约瑟夫问题(1)约瑟夫问题_数组#include "stdio.h"#include "stdlib.h"#define Length 100void main(){int i,j;int len; //输入的总节点数int n,m; //输入的每次数几个int remain; //剩下的节点数int current; //当前数到那个数字int a[Length];for(i=0;i<Length;i++){a[i]=1;}printf("请输入约瑟夫问题节点总数:");len=41; //scanf("%d",&len);printf("请输入每次数的节点数字:");n=3; //scanf("%d",&n);remain=len; //剩下的节点数current=0; //当前数到那个数字m=0; //计数到n,m=n时清零//从1开始数//循环到剩下的节点数为0printf("出列的节点的编号依次为:");while(remain>0){current++;while(current>len){current-=len;}if(a[current]==1){m++;if(m==n){a[current]=0;remain--;printf("%d, ",current);m=0;}}}system("pause");}(2)约瑟夫问题_数组环#include "stdio.h"#include "stdlib.h"void main(){int a[100];int i,len,n; //i循环 len总数 n每次数几个int cur,m,remain; //cur当前是哪个 m 计数 remain 剩下几个//int t1,t2;for(i=0;i<100;i++){a[i]=i+1;}printf("请输入约瑟夫问题节点总数:");len=41; //scanf("%d",&len);printf("请输入每次数的节点数字:");n=3; //scanf("%d",&n);a[len]=1; //首尾相连remain=len; //开始前,剩余数为总数cur=1; //当前从第1个开始m=1; //计数从1开始while(remain>0){cur=a[cur];m++;if(m==n-1){printf("%d, ",a[cur]);//t1=a[cur];//t2=a[a[cur]];a[cur]=a[a[cur]];remain--;m=0;}}system("pause");}(3)约瑟夫问题_链表#include "stdio.h"#include "stdlib.h"struct people{int num;struct people *next;};typedef struct people node;node *create(int m){int i;node *h,*p1,*p2;h=p1=p2=(node *)malloc(sizeof(node));h->num=1;for(i=1;i<m;i++){p1=(node *)malloc(sizeof(node));p2->next=p1;p1->num=i+1;p2=p1;}p1->next=h;return h;}node *findout(node *tp,int n){int i;node *p;p=tp;for(i=1;i<n-1;i++){p=p->next;}return p;}node *moveaway(node *tp){node *c,*p1,*p2;c=tp;p1=c->next;p2=p1->next;c->next=p2;printf("%d, ",p1->num);free(p1);return p2;}void main(){node *p;int len,i,n;printf("请输入约瑟夫问题节点总数:");len=41; //scanf("%d",&len);printf("请输入每次数的节点数字:");n=3; //scanf("%d",&n);p=create(len);for(i=1;i<=len;i++){p=moveaway(findout(p,n));}system("pause");}(4)约瑟夫问题_双向链表#include "stdio.h"#include "stdlib.h"struct people{int num;struct people *next;struct people *prior;};typedef struct people node;node *create(int m){int i;node *h,*p1,*p2;h=p1=p2=(node *)malloc(sizeof(node));h->num=1;for(i=1;i<m;i++){p1=(node *)malloc(sizeof(node));p2->next=p1;p1->prior=p2;p1->num=i+1;p2=p1;}p1->next=h;h->prior=p1;return h;}node *findout(node *tp,int n){int i;node *p;p=tp;for(i=1;i<n;i++){p=p->next;}return p;}node *moveaway(node *tp){node *c,*p1,*p2;c=tp;p1=c->prior;p2=c->next;p1->next=p2;p2->prior=p1;printf("%d, ",c->num);free(c);return p2;}void main(){node *p;int len,i,n;printf("请输入约瑟夫问题节点总数:");len=41;//scanf("%d",&len);printf("请输入每次数的节点数字:");n=3;//scanf("%d",&n);p=create(len);for(i=1;i<=len;i++){p=moveaway(findout(p,n));}system("pause");}3.数字7 和5(1)统计含有数字7,但不能被7整除的5位整数的个数#include <stdio.h>#include <stdlib.h>void main(){int sum=0;//统计个数int b;//起数int a[6];int have7;int j;int tempb;for(b=10000;b<100000;b++){//分离数字到数组tempb=b;for(j=0;j<5;j++){a[5-j]=tempb-(tempb/10)*10;tempb=tempb/10;}//判断是否含7have7=0;for(j=1;j<=5;j++){if(a[j]==7){have7++;}}if(have7>0 && b%7!=0){//printf("%d\n",b);sum++;}}printf("sum=%d\n",sum);system("pause");}(2)统计含有2个数字7,但不能被7整除的5位整数的个数#include <stdio.h>#include <stdlib.h>void main(){int sum=0;//统计个数int b;//起数int a[6];int have7;int j;int tempb;for(b=10000;b<100000;b++){//分离数字到数组tempb=b;for(j=0;j<5;j++){a[5-j]=tempb-(tempb/10)*10;tempb=tempb/10;}//判断是否含7have7=0;for(j=1;j<=5;j++){if(a[j]==7){have7++;}}if(have7==2 && b%7!=0){printf("%d\n",b);sum++;}}printf("sum=%d\n",sum);system("pause");}4.百钱买百鸡:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?(1)#include <stdio.h>#include <stdlib.h>void main(){int i,j,k;for(i=1;i<20;i++){for(j=1;j<33;j++){k=100-i-j;if(i*15+j*9+k==300){printf("鸡翁%d,鸡母%d,鸡雏%d\n",i,j,k);}}}system("pause");}(2)#include <stdio.h>#include <stdlib.h>void main(){int i,j,k;for(i=1;i<20;i++){for(j=1;j<33;j++){k=(100-i*5-j*3)*3;if(i+j+k==100){printf("鸡翁%d,鸡母%d,鸡雏%d\n",i,j,k);}}}system("pause");}5.逆序乘积式(1)两位数逆序乘积式#include <stdio.h>void main(){int sum=0;int a,b,c,d;int i,j,ir,jr,m,n;int arr[5];int flag;for(i=10;i<98;i++){arr[1]=a=i/10;arr[2]=b=i-a*10;for(j=i+1;j<98;j++){arr[3]=c=j/10;arr[4]=d=j-c*10;//检查有没有相同数字flag=0;for(m=1;m<4;m++){for(n=m+1;n<5;n++){if(arr[m]==arr[n]){flag=1;break;}}}//检查完//右侧的逆序ir=b*10+a;jr=d*10+c;if(flag==0&&i*j==ir*jr&&i<j&&i<ir&&i<jr){sum++;printf("%d:\ti=%d\t,j=%d\t,ir=%d\t,jr=%d\n",sum,i,j,ir,jr);}}}}(2)三位数逆序乘积式#include <stdio.h>void main(){int sum=0;int a,b,c,d,e,f;int i,j,ir,jr,m,n;int arr[7];int flag;for(i=100;i<987;i++){arr[1]=a=i/100;arr[2]=b=i/10-a*10;arr[3]=c=i-a*100-b*10;for(j=i+1;j<987;j++){arr[4]=d=j/100;arr[5]=e=j/10-d*10;arr[6]=f=j-d*100-e*10;//检查有没有相同数字flag=0;for(m=1;m<6;m++){for(n=m+1;n<7;n++){if(arr[m]==arr[n]){flag=1;break;}}}//检查完//右侧的逆序ir=c*100+b*10+a;jr=f*100+e*10+d;if(flag==0&&i*j==ir*jr&&i<j&&i<jr){sum++;printf("%d:\ti=%d\t,j=%d\t,ir=%d\t,jr=%d\n",sum,i,j,ir,jr);}}}}6.双和数组(1)普通解法#include <stdio.h>void main(){int s;int a,b,c,d,e,f;int arr[7];int flag,i,j;int sum=0;for (s=11;s<=100;s++){printf("s=%d:\n",s);for(a=1;a<=s-2;a++){for(b=a+1;b<=s-1;b++){for(d=a+1;d<=s-2;d++){for(e=d+1;e<=s-1;e++){c=s-a-b;f=s-d-e;//检查是否有重复数字arr[1]=a;arr[2]=b;arr[3]=c;arr[4]=d;arr[5]=e;arr[6]=f;if(a<b&&b<c&&d<e&&e<f){flag=0;for(i=1;i<7;i++){for(j=i+1;j<7;j++){if(arr[i]==arr[j]){flag=1;}}if(arr[i]<0){//避免负数flag=1;}}//没有重复的数字进入且符合倒数条件if(flag==0&&(a*b*c*(e*f+f*d+d*e)==d*e*f*(b*c+c*a+a*b))){sum++;printf("s=%d;a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n",s,a,b,c,d,e,f);}}}}}}}printf("sum=%d",sum);}(2)优化后解法#include <stdio.h>void main(){int s;int a,b,c,d,e,f;int arr[7];int flag,i,j;int sum=0;for (s=11;s<=100;s++){printf("s=%d:\n",s);for(a=1;a<=s-2;a++){for(b=a+1;b<=s-1;b++){for(d=a+1;d<=s-2;d++){for(e=d+1;e<=s-1;e++){c=s-a-b;f=s-d-e;//检查是否有重复数字arr[1]=a;arr[2]=b;arr[3]=c;arr[4]=d;arr[5]=e;arr[6]=f;flag=0;for(i=1;i<7;i++){for(j=i+1;j<7;j++){if(arr[i]==arr[j]){flag=1;}}if(arr[i]<0){//避免负数flag=1;}}if(a>b||a>c||b>c){flag=1;}if(d>e||d>f||e>f){flag=1;}//没有重复的数字进入且符合倒数条件if(flag==0&&(a*b*c*(e*f+f*d+d*e)==d*e*f*(b*c+c*a+a*b))){sum++;printf("s=%d;a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n",s,a,b,c,d,e,f);}}}}}}}7.八皇后问题(1)穷举法#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 8 //定义棋盘大小void main(void){int numoftimes = 0;int count = 0;int a[N + 1];int flag;int i1, i2, i3, i4, i5, i6, i7, i8, x, y, p;printf("%d皇后问题的穷举法解决",N);for (i1 = 1; i1 <= N; i1++){a[1] = i1;for (i2 = 1; i2 <= N; i2++){a[2] = i2;for (i3 = 1; i3 <= N; i3++){a[3] = i3;for (i4 = 1; i4 <= N; i4++){a[4] = i4;for (i5 = 1; i5 <= N; i5++){a[5] = i5;for (i6 = 1; i6 <= N; i6++){a[6] = i6;for (i7 = 1; i7 <= N; i7++){a[7] = i7;for (i8 = 1; i8 <= N; i8++){a[8] = i8;//检测是否冲突flag = 0;for (x = 1; x < N; x++){for (y = x + 1; y <= N; y++){if (a[x] == a[y] || abs(a[x] - a[y]) == y - x){flag = 1;break;}numoftimes++;}if(flag==1){continue;}}if (flag==0){count++;printf("第%d种解法:", count); for (p = 1; p <= N; p++){printf("%d", a[p]);}printf("\n");}}}}}}}}}printf("共运行计算%d次\n", numoftimes);printf("共找到%d种方案\n", count);system("pause");}(2)递归法#include "stdio.h"#define N 8 //定义棋盘大小static int count,a[N];// count记录当前已找到解的个数// a[N]记录皇后的位置,表示第i行的皇后放在棋盘的第a[i]列int numoftimes = 0;void recursive(int t){//尝试第t行的放置方案int i;int j;int sign = 1;if (t == N + 1){//t == N + 1//表示放下最后一个皇后,找到解法count++;/* 第1种显示方法 */// t == N + 1// 已经得到一个解决方案printf("第%d种解法:", count);//Literal1.Text += string.Format("第{0}种解法:", count); for (i = 1; i <= N; i++){printf("%d",a[i]);//Literal1.Text += string.Format("{0}", a[i]);}printf("\n");//Literal1.Text += "<br/>";/* 第2种显示方法printf("第%d种解法:\n", count);for (i = 0; i < N; i ++){for (j = 0; j < N; j ++){if (j == a[i]){printf("@ ");}else{printf("* ");}}printf("\n");}printf("\n");*/}else{//还没有放下所有的皇后for (i = 1; i <= N; i++){//依次尝试在第t行的第1列到第N列放置a[t] = i;sign = 1;for (j = 1; j <= t - 1; j++){//测试皇后在第t行第a[t]列时是否与前面已放置好的皇后相攻击。