1、 data1=data2; if(data0=data1) printf( else printf( else if(data1=data2) printf( else for(i=0;i+) printf(%2d,datai); else if(n3)/当表的元素大于3时/ i=0; while(in)/循环检测/ while(in-1&datai!=datai+1) i+; /元素i与下一个元素不重复,继续检测/ if(i+2n)j=i+2;/发现重复/ while(jn)&(datai=dataj) j+;/元素j是与元素i不重复的元素 for(k=i+1;jk+,j+) datak=d
2、ataj;/前移/ n=k; i+;i+)/输出没有重复的顺序表/%3d 2. 题目要求:一个长度为N的数组,包含一到N的正整数,找出其中有两个相等的数思路:这道题的第一个想法就是一个个比较,但是要注意到N的最大值达到106,而且时间限制为2S。这样比下去时间复杂度是O(n),但是每次都要比较,明显超时(Time Limit Exceed)。比较的时间比加减法所花的时间要长(具体长多少还不确定)。所以这题采用一加一减或者一减一加:就是在一个循环里(循环从1开始)用一个变量(初始值为0)加上接收进来的数并减去循环变量的值,直到循环结束,要注意一下结果(是正整数)。#include int g()
3、 /这个函数接收会更高效char c;int sum=0;while (c=getchar()!= )sum=sum*10+c-48;return sum;int main()int n;int val;register int i,sum;while (scanf(%d%*cn) != EOF)sum=0;for (i=1;val=g();sum+=val;sum-=i;scanf(val);printf(,sum);return 0;3. 以an为参考元素的快速排序。 int a10000; int i,j,t,n; for(i=1;=n;ai); j=n; t=an;/暂存参考元素/ i
4、=1;j)j&ai=t)i+;/当前元素不大于参考元素时,指针i后移/ if(it)j-;/当前元素大于参考元素时,指针j前移/j)ai+=aj;/将小于参考元素的当前元素前移/ ai=t;/参考元素置于分界位置/ for(i=1; printf(,ai); printf(n);4. 排序:void insertsort(int a,int n)/直接插入排序 int i,j; for(i=2;i+)/从a1,a2,a3.an/ if(aiai-1) a0=ai; for(j=i-1;a0i;j-) if(aj-1aj)/从后往前两两比较/ t=aj-1; aj-1=aj; aj=t;void
5、 selectsort(int a,int n)/简单选择排序/ int min,i,j,t; min=i; for(j=i+1;j+) if(ajamin)min=j; t=amin; amin=ai; ai=t;5. 试编写一个能在数组L1.n中找出第k小的元素(即从小到大排序后处于第k个位置的元素):int kth_elem(int a,int low,int high,int k) int pivot=alow; int low_temp=low; int high_temp=high; while(lowhigh) while(low=pivot) -high; alow=ahigh
6、;alowk) return kth_elem(a,low_temp,low-1,k); else return kth_elem(a,low+1,high_temp,k); int i,n,a100000,k;i+)/从a1,a2,a3.an/ scanf(k);,kth_elem(a,1,n,k);6. 求N!的位数:(用一个数学公式解出来)math.hint n,len;double pi,e; pi=acos(double)(-1); e=exp(1.0); len=(int)(log10(sqrt(2*pi*n)+n*log10(n/e)+1); if(n=1) len=1;,len
7、);7. 请你编写一个程序,能够将一从左到右书写的文字自动转成从右向左的顺序。输入的第一行是一个数字n(n char a201; int i,t,j,n; int count; scanf(count); getchar();/吃掉回车/ for(j=0;=count; gets(a);/输入字符串/ n=strlen(a);for(i=0;n/2; t=an-1-i; an-1-i=ai; ai=t;puts(a);/输出字符串/8. 对于给定的n (n5*106),计算代数式的值。 double sum=1; int i,n; sum=sum+1/(double)i;%.12fn9. 写一
8、个程序能够将Bob的文章中的英文字母全部变成小写的 char a51; while(gets(a)!0 puts(strlwr(a);/strlwr是将大写编成小写的函数/10. 请编写一个程序,将x分解为若干个素数的乘积。int Isp(int n) double k; int i; if(n=1) return 0; k=(double)sqrt(n);=k; if(n%i=0) return 0;/n不是素数/ return 1;/n是素数/void resolve(int n)/分解/ int i,k,m; int a1000; k=0; m=n;=m; while(m%i=0) m=
9、m/i; ak=i; k+;k-1;%d*,ak-1); int x,i,n;x)!=x;n); if(Isp(n),n); resolve(n);11. 求(其中0m0) return acker(2,acker(m,n-1); else if(n=0) return acker(2,1); return 0; int m,n;%d%dm,&,acker(m,n);12. 设2n张牌分别标记为1, 2, ., n, n+1, ., 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, ., 2n, n。即前n张牌被放到偶数位置2, 4,
10、., 2n,而后n张牌被放到奇数位置1, 3, ., 2n-1。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。现在你的的任务是计算对于给定的n的值(n105),最少需要经过多少次洗牌可恢复到初始状态。只需考虑其中一张牌,如1,回到原来位置的次数就是所求的次数。 int i,n,count; count=0; do=n) i=i*2;count+; else i=i-(2*n-i+1); while(i!=1);,count);13.求a的b次方的值的个位数的和。 int a,b,s,i;a,&b)! if(a=0&b=0)break;/a=0,b=0表示输入结束,不需要处理,break是跳出循环体/ if(a=0) 0n continue;/结束本次循环,进行下一次/ s=1;b;i+)/把a的b次方的值%9就是答案/ s=s*a; s=s%9; if(s=0) s=9;,s);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1