1、i length 则修改 length.设计函数如下:int fun(int a,int n)int length=1,counter=1;int p=a0;for(int k=1;kn;K+)if(ak=p)counter+;else p=ak;if(length counter)length=counter;counter=1;return length;(3)解题思想:从数组的第一个元素 a0开始访问,每访问到一个零,则从后面找到一个非零元素与其交换。若找不到,那么程序结束。void fun(int a,int n)int i,j,p;for(i=0;i n;i+)if(a=0)for(
2、j=i;j n;j+)if(aj!=0)p=j;break;if(j=n-1)return;a=ap;ap=0;三,解法一,解题思想:用一个数组 a200来存放集合的元素,并且设 a0=1.每次都从集合中选取最小的元素输出。如果输出的数量达到 100 个,则结束程序。否则产生两个数 y,z,并把 y,z 插入到集合中去(这里插入应该按照从小到大的顺序排序,以保证每次都选取最小的元素。)在插入的过程中还应该保证集合中没有相同的元素(集合的互异性)。设计程序如下:#include int a200;void insert(int k)int i;i=0;i-)if(a=0)continue;if(
3、k a)ai+1=a;else ai+1=k;return;void main()int count=0,n,i,y,z;a0=1;i 200;i+)n=aj;cout n ;count+;if(count%10=0)cout endl;if(count=100)return;y=2*n+1;z=3*n+1;insert(y);insert(z);解法 2,解题思想:按照自然数的顺序连续地产生数 k,判断它是否属于集合 M.如果是输出这个数,计数器 count 加一。如果不是则连续。其中判断使用一个递归函数实现。#include int judge(int k)int t;if(k=1)ret
4、urn 1;if(k-1)%2=0&judge(k-1)/2)return 1;if(k-1)%3=0&judge(k-1)/3)return 1;return 0;void main()int k=1,count=0;while(count 100)if(judge(k)cout k ;count+if(count%10=0)cout endl;99年试题答案 一,(2)解题思想:平面上任意三点只要不共线,则一定能构造出一个三角形。所以只要 k1=(y2-y1)/(x2-x1)和 k2=(y3-y2)/(x3-x2)不相等或互为相反数就可以构成三角形。#define MAX 3.4e37 t
5、ypedef struct int x;int y;PointType100;int Triangle(PointType Points)int i,j,k,count=0;float K1,K2;i 100;i+)for(j=i+1;j 100;j+)for(k=j+1;k 100;k+)if(Pointsj.x=Points.x)else K1=(Pointsj.y-Points.y)*1.0/(Pointsj.x-Points.x);if(Pointsj.x=Pointsk.x)K2=MAX;else K2=(Pointsj.y-Pointsk.y)*1.0/(Pointsj.x-Poi
6、ntsk.x);if(K1=K2)continue;return count;二。解题思想:对于点 N1,设它邻接到 a,b,c.,那么只要求出 a,b,c.,到 N2的所有路径。递归地调用这个过程,就可以求出解。设计程序如下:#include struct node int x;struct node*next;node*head;void print()node*p=head;while(p!=NULL)cout x next;cout next;delete p;void insert(int i)node*p=new node;p-x=i;p-next=head;head=p;void
7、 paths(int a1010,int N1,int N2)if(N1=N2)print();for(int i=0;i 10;i+)if(aN1=1)insert(i);paths(a,i,N2);del();三,解题思想:设表 l1和 l2 分别有 m,n 个元素。那么这个保序合并的过程就是把n 个元素往 m+1个位置插入的过程,其中插入的顺序必须保持原有的顺序。由组合数学的知识可以知道,这种插入一共有(m+n)!/m!*n!种排序方法。现在我们用一个数组 cm+1来记录这 m+1 个位置的元素的个数,那么只要记录先来 cm+1的具体数值就可以唯一确定 l1 和 l2的保序合并表,打印的
8、时候只需要根据 cm+1打印即可。#include const int m=3;const int n=3;char l1m=1,2,3;char l2n=a,b,c;void merges(int c,int p;int k)int i,j;if(k=n+1)print(c);/递归出口,如果所有的数都放完了,打印,返回 for(j=0;j m+1;j+)dj=cj;cp=cp+1;/p 位置放下一个数 k+;for(i=p;i m+1;i+)merge(c,i,k);for(j=0;j+)cj=dj;k-;void main()int cm+1;int k=1;i+)c=0;merge(c
9、,0,k);void print(int c)int sum=0,p=0;i+)sum+=c;if(sum!=n)return;i+)for(int j=0;j+)cout l2p;cout l1;cout endl;四,解题思想:按照数目的元素作为交换规则,可以得到:aj和 am-1n-1互相交换。如果有偶数行,那么前 m/2和后 m/2行交换;如果有奇数行,那么第 m/2 的前n/2 个数和后 n/2 个数相交换。include void swapt(int amn)int temp,i,j;i(m/2);i+)for(j=0;j+)temp=aj;aj=am-1-in-1-j;am-1-in-1-j=temp;if(m%2!=0)for(j=0;j length 则修改 length.设计函数如下:j(n/2);j+)temp=am/2j;am/2j=am/2n-1-j;am/2n-1-j=temp;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1