C编程(西安邮电大学MOOC)

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=(a1b1,…,ambmbm+1,…,bn)m<=n

或者

      LC=(a1b1,…,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 }
原文地址:https://www.cnblogs.com/GoldenEllipsis/p/11703296.html