1、最大与次大值
题目内容:编写程序,找出给定的n个数中的最大值及次大值。
输入格式:在第一行中输入一个正整数n(1<n≤10)。第二行输入n个整数,用英文逗号,隔开。
输出格式:在一行中输出最大值及次大值,中间用英文逗号,隔开。
输入样例:7
12,1,2,5,4,7,3
输出样例:12,7
1 /* 2 求最大值、次大值可以不用排序 3 */ 4 #include <stdio.h> 5 #define N 100 6 int main() 7 { 8 int n, a[N] = {0}; 9 scanf("%d",&n); 10 for(int i=0; i<n-1; ++i){ 11 scanf("%d,",&a[i]); 12 } 13 scanf("%d",&a[n-1]); 14 /* 只一个元素最大次大相同 */ 15 int max1 = a[0], max2 = a[0]; 16 a[1] > max1 ? max1 = a[1] : max2 = a[1]; 17 for(int k=2; k<n; ++k){ 18 if(a[k]>max1){ 19 max2 = max1; 20 max1 = a[k]; 21 } 22 else if(a[k]>max2){ 23 max2 = a[k]; 24 } 25 } 26 printf("%d,%d ",max1, max2); 27 return 0; 28 }
1 /* 2 与只求最大值的程序一样吗, 3 好像是, 可以排序。 4 */ 5 #include <stdio.h> 6 #define N 100 7 int main() 8 { 9 int n, a[N] = {0}; 10 scanf("%d",&n); 11 for(int i=0; i<n-1; ++i){ 12 scanf("%d,",&a[i]); 13 } 14 scanf("%d",&a[n-1]); 15 /* 插入排序 */ 16 for(int i = 0; i<n; ++i){ 17 int min = a[i]; 18 int index = i; 19 for(int j = i+1; j<n; ++j){ 20 if(min>a[j]){ 21 min = a[j]; 22 index = j; 23 } 24 } 25 if(index != i){ 26 a[index] = a[i]; 27 a[i] = min; 28 } 29 } 30 printf("%d,%d ",a[n-1],a[n-2]); 31 return 0; 32 }
2、素数排序
题目内容:输入10个正整数到a数组中,对a[10]数组中的素数升序排序。
输入格式:在一行中输入10个用英文逗号,隔开的正整数。
输出格式:在一行中输出升序的素数序列,每个数之间用英文逗号,隔开,末尾没有多余的空格。
输入样例:10,3,1,5,4,8,7,2,9,11
输出样例:2,3,5,7,11
输入样例:16,12,1,6,4,8,14,18,24,21
输出样例:Not found!
1 /* */ 2 #include <stdio.h> 3 #define N 100 4 /* 判断素数 */ 5 int isPrime(int key) 6 { 7 if(key<2) 8 return 0; 9 for(int i=2; i<key; ++i) 10 if(key%i==0) 11 return 0; 12 return 1; 13 } 14 /* 升序插入 */ 15 void InsertArr(int *arr, int n, int key) 16 { 17 int j=n; 18 while(j>=0 && key>arr[j]){ 19 arr[j+1]=arr[j];/*移动,向后赋值*/ 20 j--; 21 } 22 arr[j+1]=key;/**/ 23 } 24 int main() 25 { 26 int n=0, arr[N] = {0},a[N] = {0}; 27 28 for(int i=0; i<9; ++i){ 29 scanf("%d,",&a[i]); 30 if(isPrime(a[i])){ 31 InsertArr(arr,n,a[i]); 32 n++; 33 } 34 } 35 scanf("%d",&a[9]); 36 if(isPrime(a[9])){ 37 InsertArr(arr,n,a[9]); 38 n++; 39 } 40 if(n==0) 41 printf("Not found!"); 42 else{ 43 for(int i=n-1; i>0; --i){ 44 printf("%d,",arr[i]); 45 } 46 printf("%d",arr[0]); 47 } 48 return 0; 49 }
3、循环右移
题目内容:一个数组A中存有N>0个整数,将每个整数循环向右移M≥0个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。
输入格式:第1行输入N(1≤N≤100)和M(≥0)中间用英文逗号,分隔第2行输入N个整数,中间用英文 逗号,分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,中间用英文逗号,分隔,序列结尾不能有多余空格。
输入样例:7,3
1,2,3,4,5,6,7
输出样例:5,6,7,1,2,3,4
输入样例:7,0
1,2,3,4,5,6,7
输出样例:1,2,3,4,5,6,7
1 #include <stdio.h> 2 #define N 100 3 4 /* 头插入 */ 5 void InsertHead(int *arr, int index, int key) 6 { 7 for(int j=index-1; j>=0; j--){ 8 arr[j+1]=arr[j];/*移动*/ 9 } 10 arr[0]=key; 11 } 12 int main() 13 { 14 int n, m, arr[N] = {0}; 15 scanf("%d,%d",&n,&m); 16 17 for(int i=0; i<n-1; ++i){ 18 scanf("%d,",&arr[i]); 19 } 20 scanf("%d",&arr[n-1]); 21 22 while(m--) 23 InsertHead(arr,n-1,arr[n-1]); 24 25 for(int i=0; i<n-1; ++i){ 26 printf("%d,",arr[i]); 27 } 28 printf("%d",arr[n-1]); 29 return 0; 30 }
1 /* 算法2 整体右移动m位, 右m位全部移动到数组左边 */ 2 #include <stdio.h> 3 #define N 100 4 5 int main() 6 { 7 int n, m, arr[N] = {0}; 8 scanf("%d,%d",&n,&m); 9 10 for(int i=0; i<n-1; ++i){ 11 scanf("%d,",&arr[i]); 12 } 13 scanf("%d",&arr[n-1]); 14 /* 1.数组整体向右移动m位 */ 15 for(int i=n-1; i>=0; --i) 16 arr[i+m] = arr[i]; 17 /* 2.右m位全部移动到数组左边 */ 18 for(int i=0; i<m; ++i) 19 arr[i] = arr[i+n]; 20 21 for(int i=0; i<n-1; ++i){ 22 printf("%d,",arr[i]); 23 } 24 printf("%d",arr[n-1]); 25 return 0; 26 }
1 /* 算法3 置换圈 */ 2 #include <stdio.h> 3 #define N 100 4 int gcd(int n, int m)//最大公约数 5 { 6 while(n) 7 { 8 int r = m%n; 9 m = n; 10 n = r; 11 } 12 return m; 13 } 14 int main() 15 { 16 int n, m, arr[N] = {0}; 17 scanf("%d,%d",&n,&m); 18 19 for(int i=0; i<n-1; ++i){ 20 scanf("%d,",&arr[i]); 21 } 22 scanf("%d",&arr[n-1]); 23 24 int count = gcd(n,m);//圈数(最大公约数) 25 int length = n / count; //圈长度 26 for(int i=0; i<count; ++i)//循环处理count圈 27 { 28 int t = arr[i]; //圈头元素 29 int start = i; //圈头下标 30 int end = (start-m+n)%n;//圈尾下标 31 for(int j=1; j<length; j++)//圈内移位 32 { 33 arr[start] = arr[end]; 34 start = end; 35 end = (end-m+n)%n; 36 } 37 arr[start] = t;//圈头元素就位 38 } 39 40 for(int i=0; i<n-1; ++i){ 41 printf("%d,",arr[i]); 42 } 43 printf("%d",arr[n-1]); 44 return 0; 45 }
1 /* 算法4 逆序 */ 2 #include <stdio.h> 3 #define N 100 4 /* 逆序 */ 5 void reverse(int* arr, int left, int right) 6 { 7 while(left<right) 8 { 9 int t = arr[left]; 10 arr[left] = arr[right]; 11 arr[right] = t; 12 left++, right--; 13 } 14 } 15 int main() 16 { 17 int n, k, arr[N] = {0}; 18 scanf("%d,%d",&n,&k); 19 /* 输入数组 */ 20 for(int i=0; i<n-1; ++i){ 21 scanf("%d,",&arr[i]); 22 } 23 scanf("%d",&arr[n-1]); 24 /* 1.将数组分成两段,左段长为n-k,右段长为k 25 分别将两段逆转(即元素排列次序与原次序相反) */ 26 reverse(arr,0,n-k-1); 27 reverse(arr,n-k,n-1); 28 /* 2.再数组元素整体逆转 */ 29 reverse(arr,0,n-1); 30 /* 打印 */ 31 for(int i=0; i<n-1; ++i){ 32 printf("%d,",arr[i]); 33 } 34 printf("%d",arr[n-1]); 35 return 0; 36 }
1 /* 算法5.辅助数组 */ 2 #include <stdio.h> 3 #define N 100 4 int main() 5 { 6 int n, k, arr1[N] = {0},arr2[N] = {0}; 7 scanf("%d,%d",&n,&k); 8 /* 输入数组 */ 9 for(int i=0; i<n-1; ++i){ 10 scanf("%d,",&arr1[i]); 11 } 12 scanf("%d",&arr1[n-1]); 13 /* 复制 */ 14 for(int i=0; i<n; ++i){ 15 arr2[i] = arr1[(i-k+n)%n];//左移arr1[(i+k)%n]; 16 } 17 /* 打印 */ 18 for(int i=0; i<n-1; ++i){ 19 printf("%d,",arr2[i]); 20 } 21 printf("%d",arr2[n-1]); 22 return 0; 23 }
1 /* 算法6.循环队列理论,直接输出 */ 2 #include <stdio.h> 3 #define N 100 4 int main() 5 { 6 int i, n, k, arr[N] = {0}; 7 scanf("%d,%d",&n,&k); 8 /* 输入数组 */ 9 for(int i=0; i<n-1; ++i){ 10 scanf("%d,",&arr[i]); 11 } 12 scanf("%d",&arr[n-1]); 13 14 /* 打印 */ 15 for(i=0; i<n-1; ++i){ 16 printf("%d,",arr[(i-k+n)%n]); 17 } 18 printf("%d",arr[(i-k+n)%n]); 19 return 0; 20 }
4、爬楼梯
题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。
输入格式:输入一个整数n,(1<=n<46)。
输出格式:输出当楼梯阶数是n时的上楼方式总数。
输入样例:1
输出样例:1
输入样例:4
输出样例:7
输入样例:24
输出样例:1389537
1 #include <stdio.h> 2 3 double fun(int n){ 4 if(n==1) 5 return 1; 6 else if(n==2) 7 return 2; 8 else if(n==3) 9 return 4; 10 return fun(n-1) + fun(n-2)+ fun(n-3); 11 } 12 13 int main() 14 { 15 int n; 16 scanf("%d",&n); 17 printf("%.f",fun(n)); 18 return 0; 19 }
5、三天打鱼两天晒网
题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?
输入样例:1990-1-3
输出样例:他在打鱼
输入样例:2018-11-13
输出样例:他在晒网
1 #include<stdio.h> 2 int inputdate(); 3 int main() 4 { 5 int n = inputdate(); 6 /* if(-1==n){ 7 printf("Invalid input"); 8 } 9 else */ 10 if(n%5==0||n%5==4){ 11 printf("他在晒网"); 12 } 13 else{ 14 printf("他在打鱼"); 15 } 16 17 return 0; 18 } 19 int inputdate() 20 { 21 int year,month,day; 22 int n = scanf("%4d-%2d-%2d",&year,&month,&day); 23 /* if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){ 24 return -1; 25 } */ 26 27 int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, 28 {31,29,31,30,31,30,31,31,30,31,30,31}}; 29 30 int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0); 31 for(int i=0;i<month-1;++i){ 32 sum +=date[flag][i]; 33 } 34 35 return sum+day; 36 }
6、时间换算
题目内容:编写程序,实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。
程序需要处理以下三种特殊情况:
(1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;
(2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;
(3)若小时数加1后为24,则小时数恢复到0。
输入样例:18:1:2
输出样例:18:01:03
输入样例:20:12:59
输出样例:20:13:00
输入样例:23:59:59
输出样例:00:00:00
1 #include<stdio.h> 2 void run(); 3 int main() 4 { 5 run(); 6 7 return 0; 8 } 9 void run() 10 { 11 int h,m,s; 12 scanf("%d:%d:%d",&h,&m,&s); 13 14 s++; 15 if(s==60){ 16 s=0; 17 m++; 18 } 19 if(m==60){ 20 m=0; 21 h++; 22 } 23 if(h==24){ 24 h=0; 25 } 26 printf("%02d:%02d:%02d ",h,m,s); 27 }
7、正向建立单链表
题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。
输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。
输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
1 #include <stdio.h> 2 #include <malloc.h> 3 typedef struct node NODE; 4 typedef struct node* Linklist; 5 struct node{ 6 int data; 7 Linklist next; 8 }; 9 /* 10 //头插法(输入与输出是逆序) 11 Linklist create(){ 12 Linklist L,p; 13 L = p = (Linklist)malloc(sizeof(NODE)); 14 L->next = NULL; 15 int x; 16 scanf("%d",&x); 17 while(x!=-1) 18 { 19 p = (Linklist)malloc(sizeof(NODE)); 20 p->data = x; 21 p->next = L->next; 22 L->next = p; 23 scanf("%d",&x); 24 } 25 return L; 26 } */ 27 // 尾插法(输入与输出正序) 28 Linklist create(){ 29 Linklist L,p,r; 30 L = r = (Linklist)malloc(sizeof(NODE)); 31 L->next = NULL; 32 int x; 33 scanf("%d",&x); 34 while(x!=-1) 35 { 36 p = (Linklist)malloc(sizeof(NODE)); 37 p->data = x; 38 p->next = NULL; 39 r->next = p; 40 r = p; 41 scanf("%d",&x); 42 } 43 return L; 44 } 45 void print(Linklist L){ 46 while(L->next) 47 { 48 L = L->next; 49 printf("--%d",L->data); 50 } 51 } 52 int main() 53 { 54 Linklist L = create(); 55 print(L); 56 return 0; 57 }
8、逆置单链表
题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。
输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
下一行内输出逆置后的单链表数据结果,之间用两个分隔符 -- 隔开。
输入样例:2 4 6 8 10 -1
输出样例:--2--4--6--8--10
--10--8--6--4--2
1 #include <stdio.h> 2 #include <malloc.h> 3 typedef struct node NODE; 4 typedef struct node* Linklist; 5 struct node{ 6 int data; 7 Linklist next; 8 }; 9 void reverse(Linklist L) 10 { 11 Linklist NEW = NULL, CUR = L->next, TEMP; 12 while(CUR)//是否空 13 { 14 TEMP = CUR->next;//保存新表的当前指针的前驱指针(无前驱为NULL) 15 CUR->next = NEW;// 逆序(NEW为新表当前CUR的后继指针) 16 NEW = CUR;//更新新表后继指针 17 CUR = TEMP;//更新新表当前指针 18 } 19 L->next = NEW;//逆序的头指针插入头结点 20 } 21 Linklist create() 22 { 23 Linklist L,p,r; 24 L = r = (Linklist)malloc(sizeof(NODE)); 25 L->next = NULL; 26 int x; 27 scanf("%d",&x); 28 while(x!=-1) 29 { 30 p = (Linklist)malloc(sizeof(NODE)); 31 p->data = x; 32 p->next = NULL; 33 /* ---------- */ 34 r->next = p;//尾插 35 r = p; //更新尾指针 36 scanf("%d",&x); 37 } 38 return L; 39 } 40 void print(Linklist L) 41 { 42 while(L->next) 43 { 44 L = L->next; 45 printf("--%d",L->data); 46 } 47 printf(" "); 48 } 49 int main() 50 { 51 Linklist L = create(); 52 print(L); 53 reverse(L);//逆序 54 print(L); 55 return 0; 56 }
9、链表合并
题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。
LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n
或者
LC=(a1,b1,…,an,bn,an+1,…,am),m>n
输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束)
一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束)
输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。
输入样例:1 3 5 7 -1
2 4 6 -1
输出样例:--1--2--3--4--5--6--7
1 #include <stdio.h> 2 #include <malloc.h> 3 typedef struct node NODE; 4 typedef struct node* Linklist; 5 struct node{ 6 int data; 7 Linklist next; 8 }; 9 Linklist mergelist(Linklist LA,Linklist LB) 10 { 11 /* 12 LA的头指针为新链表的头、尾指针 13 LB的头结点释放 14 */ 15 Linklist head = LA,rear = LA,temp = LB; 16 LA = LA->next; 17 LB = LB->next; 18 free(temp); 19 /* 逐个结点链接到新链表 */ 20 while(LA && LB) 21 { 22 /* 先插LA再插LB */ 23 if(LA) 24 { 25 rear->next = LA;//尾插结点 26 rear = rear->next;//更新尾结点 27 LA = LA->next; 28 } 29 if(LB) 30 { 31 rear->next = LB;//尾插结点 32 rear = rear->next;//更新尾结点 33 LB = LB->next; 34 } 35 } 36 if(LA) 37 rear->next = LA;//尾插剩余结点 38 if(LB) 39 rear->next = LB; 40 return head; 41 } 42 Linklist create(){ 43 Linklist L,p,r; 44 L = r = (Linklist)malloc(sizeof(NODE)); 45 L->next = NULL; 46 int x; 47 scanf("%d",&x); 48 while(x!=-1) 49 { 50 p = (Linklist)malloc(sizeof(NODE)); 51 p->data = x; 52 p->next = NULL; 53 r->next = p; 54 r = p; 55 scanf("%d",&x); 56 } 57 return L; 58 } 59 void print(Linklist L){ 60 while(L->next) 61 { 62 L = L->next; 63 printf("--%d",L->data); 64 } 65 printf(" "); 66 } 67 int main() 68 { 69 Linklist L1 = create(); 70 Linklist L2 = create(); 71 Linklist L3 = mergelist(L1,L2); 72 print(L3); 73 return 0; 74 }
10、求2~2000的所有素数.有足够的内存,要求尽量快
1 #include <stdio.h> 2 #include <assert.h> 3 /* 素数集合 */ 4 int findvalue[2000]; 5 static int find;/*素数集合下标从0开始*/ 6 bool adjust(int value) 7 { 8 assert(value>=2);/* value>=2 */ 9 if(value==2) return true; 10 /* 被素数整除的不是素数 */ 11 for(int i=0;i<=find;i++) 12 { 13 if(value%findvalue[i]==0) 14 return false; 15 } 16 findvalue[find++]; 17 return true; 18 } 19 int main() 20 { 21 /* 测试, 2~100中的素数集合 */ 22 for(int i=2; i<100; ++i) 23 if(adjust(i)) 24 findvalue[find] = i; 25 /* 打印素数集合 */ 26 for(int j=0;findvalue[j]; ++j) 27 printf("%d ",findvalue[j]); 28 return 0; 29 }
11、计算器
输入一个四则运算算式,运算符为+、-、*、/,操作数为实型数据,对于除法算式,除数不为0,输出算式中的操作数要求保留小数点后两位。
[测试输入1]1.2+3.4
[测试输出1]1.20+3.40=4.60
[测试输入2]2.5*2
[测试输出2]2.50*2.00=5.00
1 #include <stdio.h> 2 #define N 100 3 int main() 4 { 5 double a,b; 6 char op; 7 scanf("%lf %c%lf",&a,&op,&b); 8 double result=0; 9 switch(op){ 10 case '+':result = a+b;break; 11 case '-':result = a-b;break; 12 case '*':result = a*b;break; 13 case '/':result = a/b;break; 14 } 15 printf("%.2f%c%.2f=%.2f ",a,op,b,result); 16 return 0; 17 }
12、日期合法性判定
从键盘输入一个8位整数表示的日期(即yyyymmdd,表示yyyy年mm月dd日),判断该日期是否为合法日期。
[输入样例] 19990101
[输出样例] 1999年1月1日是合法日期
[输入样例] 19361321
[输出样例] 1936年13月21日是非法日期
[输入样例] 19780431
[输出样例] 1978年4月31日是非法日期
[输入样例] 20000229
[输出样例] 2000年2月29日是合法日期
[输入样例] 21000229
[输出样例] 2100年2月29日是非法日期
[输入样例] 19980229
[输出样例] 1998年2月29日是非法日期
1 #include <stdio.h> 2 #define N 100 3 int main() 4 { 5 int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 6 int y,m,d,flag =0; 7 scanf("%4d%2d%2d",&y,&m,&d); 8 int leapyear = y%4==0&&y%100!=0||y%400==0; 9 if(leapyear) arr[2]++; 10 if(m<=12&&m>=1&&d<=arr[m]&&d>=1) 11 flag = 1; 12 printf("%d年%d月%d日",y,m,d); 13 if(flag) 14 printf("是合法日期"); 15 else 16 printf("是非法日期"); 17 return 0; 18 }
13、求完数
一个正整数如果恰好等于它的因子之和,这个数就称为“完数”,编程找出X之内(包含X)的所有完数并从小到大依次输出各个完数,以空格间隔。例如:6=1+2+3,所以6就是完数。
[样例输入] 100
[样例输出] 6 28
[样例输入] 1000
[样例输出] 6 28 496
1 #include<stdio.h> 2 int fun(int i) 3 { 4 int sum=0,t = i-1; 5 while(t) 6 { 7 if(i%t==0) 8 sum += t; 9 t--; 10 } 11 if(sum==i) return 1; 12 return 0; 13 } 14 15 int main() 16 { 17 int n,flag=0; 18 scanf("%d",&n); 19 20 for(int i=6;i<=n;++i) 21 { 22 if(fun(i)){ 23 if(flag) printf(" "); 24 printf("%d",i); 25 flag = 1; 26 } 27 } 28 return 0; 29 }
14、生日蜡烛
[题目描述] 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了N根蜡烛。
请问,他从多少岁开始办生日party的,现在他多少岁?
例如:若N=236,因为236=26+27+28+29+30+31+32+33,所以,他从26岁开始办生日party,他现在33岁。
[输入说明] 输入一共吹熄的蜡烛数N。
[输出说明] 输出他办生日party的起止年龄数,以空格隔开;若有多种情况,输出起始年龄最小的一种情况。
[样例输入] 236
[样例输出] 26 33
[样例输入] 186
[样例输出] 10 21
1 #include<stdio.h> 2 void fun(int n, int *s,int *e){ 3 for(int i=1;i<=100;++i) 4 { 5 int sum=0; 6 for(int j=i; j<=100; ++j){ 7 sum += j; 8 if(sum==n){ 9 *s=i; 10 *e=j; 11 return; 12 } 13 } 14 } 15 } 16 int main() 17 { 18 int n,s,e; 19 scanf("%d",&n); 20 fun(n,&s,&e); 21 printf("%d %d",s,e); 22 return 0; 23 }
15、整数排序
[题目描述] 从键盘输入n个整数,将其从小到大进行排序,并将排序后的结果输出。特别说明:待排序的整数的个数不超过20个。
[输入说明] 第一行为n值,第二行输入n个整数,以空格间隔。
[输出说明] 输出的数据用空格隔开。
[样例输入]
5
5 6 1 2 3
[样例输出]
1 2 3 5 6
1 /*快速排序*/ 2 #include <stdio.h> 3 void QuickSort(int *a,int n, int left, int right) 4 { 5 int i,j,t; 6 /*左指针left指向数组头 右指针right指向数组尾*/ 7 if(left<right){ 8 i=left,j=right+1;/*左右指针*/ 9 while(i<j){ 10 while(i+1<n && a[++i]<a[left]);/*左指针右移 指向大于基数的数据停止*/ 11 while(j-1>-1 && a[--j]>a[left]);/*右指针左移 指向小于基数的数据停止*/ 12 if(i<j)/*满足左指针小于右指针的条件 两指针指向数据交换*/ 13 t=a[i],a[i]=a[j],a[j]=t; 14 } 15 t=a[left],a[left]=a[j],a[j]=t;/*右指针指向数据与基数交换*/ 16 QuickSort(a,n,left,j-1);/*左边数据递归*/ 17 QuickSort(a,n,j+1,right);/*右边数据递归*/ 18 } 19 } 20 21 int main() 22 { 23 int i,n, arr[20]={0}; 24 scanf("%d",&n); 25 for(i=0; i<n; ++i) 26 scanf("%d",&arr[i]); 27 QuickSort(arr,n,0,n-1); 28 for(i=0; i<n; ++i) 29 printf("%d ",arr[i]); 30 return 0; 31 }