/*C语言程序设计大赛的第一题.*/ /*题目:找出一组数列(个数大于等于2)中长度最大的所有等值数列段,并指示其起始 位置、末尾位置,如果没有等值数列段,则标志出特殊字句.(题目好像大概中这一个意思) 所谓的等值数列段,比如数列:1 ,2 ,2 ,2 ,3 ,3 ,4.中的2,2,2和3,3就是所谓的等值数列段*/ /*我的想法:*/ /*要找出一组数列中的等值数列段,首先要考虑等值数列段有什么特征:起始位置、末位置以及长度. 但是要同时找出并记录它的三个特征,我觉得用一两个变量应该是很难做到的。认识的这一点,我觉得 应该要将等值数列段定义为一种新的数据结构,以便进行更好地储存并操作。*/ /*我的做法如下:*/ /* 既然知道了如何储存等值数列段的几个东东,那么下一步就是要找出达到要求的等值数列段。 要找出最长的等值数列段,我没有一步做到要求.呃。。功力未够深厚,写不出这么难的算法。 所以我分了几步来完成: 第一步:找出所有的等值数列段。 第二步:找出最长的等值数列段。 第三步:找出所有最长的等值数列段。 第四步:输出结果 */ /*具体做法如下*/ #include<stdio.h> typedef struct eq_arrary { /*定义等值数列段的数据结构*/ int sps ; /*标示起始位置*/ int eps ; /*标示结尾位置*/ int len ; /*记录长度*/ } eq_arrary ; int main(void) { int i = 0 , j = 0 , k = 0 ; /*一些循环变量*/ int n = 20 ; int start = 0 ; /*记录等值数列段开始位置的中间变量*/ int count = 1 ; /*利用这一个变量,找出等值数列段*/ int MaxLen = 0 ; /*记录最长的等值数列段的长度*/ int MaxPs[10] ; /*记录所有最长的等值数列段的位置,这一步应该是败笔,因为 要事先分配内存,无法估计有多少组相同的最长的等值数列段, 无法做到动态分配空间.应该有更好的算法,以后想想。*/ int test[20] = {1,2,2,2,3,4,4,4,3,4,6,5,6,6,7,8,8,8,9,9} ; /*提供一组测试数据,可以任意修改来测试*/ eq_arrary eqary[10] ; /*声明一定等值数列段变量,分其分配内存空间*/ printf("The test int value arrray :/n ") ; for(i = 0 ; i < n ; i++) { printf("%3d" , test[i]); } printf("/n/n"); for(i = 0 ; i < n-1 ; i++) /*找出所有等值数列段,并一一记录其起始位置,末位置,长度*/ { if(test[i] == test[i+1]) { count++; continue ; } else if(count >= 2) { eqary[j].sps = start ; eqary[j].eps = i ; eqary[j].len = count ; j++ ; start = i + 1 ; count = 1 ; } else { start = i + 1 ; count = 1 ; } } if(0 == j) { printf("/nNo such equal arrary/n") ; } else { for( i = 0 , MaxLen = eqary[0].len , MaxPs[0] = 0 ; i < j ; i++) /*找出最长的等值数列段*/ { if(eqary[i].len > MaxLen) { MaxLen = eqary[i].len ; } } for( i = 0 ; i < j ; i++) /*找出所有长度最长的等值数列段*/ { if(eqary[i].len == MaxLen) { MaxPs[k] = i ; k++ ; } } for(i = 0 ; i < k ; i++) /*输出结果*/ { printf("/nmaxlen = %d , startposition = %d , endposition = %d/n" , eqary[MaxPs[i]].len , eqary[MaxPs[i]].sps,eqary[MaxPs[i]].eps); } } printf("/nByeBye./n"); return 0 ; } /*C语言程序设计大赛的第四题.*/ /*题目:给出一四阶矩阵,找出其中的规律,并利用其规律,打印出矩阵。 (不能利用printf在指定位置上直接打印出矩阵) 如题: 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 */ /*我的想法:*/ /*其实这一题没有什么好说,要找出规律,找出规律之后算法上就没有什么问题了. 不过,要找出其中的规律的确是一件的蛋痛的事,我花了很久的时间也没有看出来。 然后,不知道为什么突然之间有了灵感。。。。(做这些题,就是需要灵感。。。) 看到了“16”和“1”,如果这一个矩阵是按降序的顺序排列的话,“16”和“1”的 顺序是正确的,然后我再顺序着16数下去,接着的是2、3,发现不对。然后,我再从1按 上去,接着的是14、15,也是不对。不过,这一下我发现了一个规律:2、3的位置分别与 15、14的位置交换了。然后再整体看一看这矩阵,整个矩阵还有另外一个规律,那就是副 对角线上的数字位置本来就是正确的,那么所有的规律就一目了然了:除16和1,11和6 以及副对角线上的数字没有进行交换位置之外,其他的数字都进行了倒置。 */ /*我的做法如下:*/ /* 排除了了不变的数字,然后以其他数字进行倒置。 */ /*具体做法如下*/ #include<stdio.h> int main(void) { int test[16] = {16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1} ; //测试数组 int temp ; //交换的中间变量 int i ; printf("/nThe original matrix:/n") ; for(i = 0 ; i < 16 ; i++) { printf("%3d",test[i]); } for(i = 1 ; i < 8 ; i++) { if(3 == i || 6 == i || 9 == i || 12 == i || 5 == i) //不变数字的变量 { continue ; } temp = test[i] ; test[i] = test[15-i] ; test[15-i] = temp ; } printf("/nNow I will print the matrix:/n"); for(i = 0 ; i < 16 ; i++) { if((i % 4) == 0) { printf("/n"); } printf("%3d",test[i]); } printf("/nByeBye/n"); return 0 ; }